Only check for situations without shebang Issue: https://github.com/linuxdeepin/developer-center/issues/8682
100 lines
2.6 KiB
Bash
100 lines
2.6 KiB
Bash
#!/bin/bash
|
||
|
||
# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
|
||
#
|
||
# SPDX-License-Identifier: LGPL-3.0-or-later
|
||
|
||
# This hook script wraps the startup of all applications within this script,
|
||
# in order to fix the issue of some applications not being able to start without shebang in their startup scripts
|
||
|
||
|
||
# ===== Log =====
|
||
# log.info xxx
|
||
# log.warn xxx
|
||
# log.info xxx
|
||
# log.debug xxx
|
||
|
||
function log.color_output() {
|
||
local color=$1
|
||
shift 1
|
||
|
||
echo >&2 -e "\033[${color}m$@\033[0m"
|
||
return 0
|
||
}
|
||
|
||
# Log is named without prefix "utils." for convenience
|
||
# Usage: log.log <level> ...content
|
||
function log.log() {
|
||
if [[ $# < 2 ]]; then
|
||
return -1
|
||
fi
|
||
|
||
local level=$1
|
||
shift 1
|
||
|
||
case $level in
|
||
error) log.color_output "0;31" "[ERROR] $@" ;;
|
||
warn) log.color_output "1;33" "[WARN] $@" ;;
|
||
info) log.color_output "1;37" "[INFO] $@" ;;
|
||
debug) log.color_output "1;30" "[DEBUG] $@" ;;
|
||
esac
|
||
|
||
return 0
|
||
}
|
||
|
||
function log.error() { log.log "error" "$@"; }
|
||
function log.warn() { log.log "warn" $@; }
|
||
function log.info() { log.log "info" $@; }
|
||
function log.debug() { log.log "debug" $@; }
|
||
|
||
|
||
function check_file_no_shebang(){
|
||
local file_type=$(file -b "${1}")
|
||
# 文件类型是纯文本文件、有可执行权限,并且不是脚本文件,则可能忘记加上shebang
|
||
if [[ ($file_type == *"ASCII text"* || $file_type == *"Unicode text"*) && -x "$exec_cmd_origin_path" && "$file_type" != *"script"* ]]; then
|
||
true
|
||
else
|
||
false
|
||
fi
|
||
}
|
||
|
||
function check_file_is_python(){
|
||
if file -b "${1}" | grep -q "Python script" ;then
|
||
true
|
||
else
|
||
false
|
||
fi
|
||
}
|
||
|
||
function choose_python(){
|
||
pythonInterpreter=$(command -v python3 || command -v python)
|
||
if [ -z "${pythonInterpreter}" ]; then
|
||
log.warn "Python interpreter not found. Trying to continue"
|
||
exec "$@"
|
||
fi
|
||
log.debug "Automatically add interpreter ${pythonInterpreter} to launch app."
|
||
}
|
||
|
||
exec_cmd_origin_path=$1
|
||
|
||
if [[ -e ${exec_cmd_origin_path} ]]; then
|
||
|
||
|
||
##### 1. Check if the file is a script and is excutable and lack of shebang.(If not excutable, we should not let it run.)
|
||
##### 1.1 If python, then use python, else use bash.
|
||
##### 2. If do not need to fix,just try to run.
|
||
|
||
if check_file_no_shebang "${exec_cmd_origin_path}" ; then
|
||
log.debug "The executable is a script without shebang. Trying to fix..."
|
||
exec bash -c "$@"
|
||
elif check_file_is_python "${exec_cmd_origin_path}" ; then
|
||
choose_python
|
||
exec ${pythonInterpreter} "$@"
|
||
else
|
||
exec "$@"
|
||
fi
|
||
else
|
||
log.info "${exec_cmd_origin_path} maybe not an absolute path. Continue"
|
||
exec "$@"
|
||
fi
|