#linux #bash #shell #sh
Вопрос:
#!/data/data/com.termux/files/usr/bin/bash
basedir=$(dirname "$0")
#unset LD_PRELOAD in case termux-exec is installed. If termux-exec is also installed inside the jail it will set again.
unset LD_PRELOAD
command="proot"
command =" -r $basedir/termux-fs"
command =" -b /system"
command =" -b /dev/"
command =" -b /sys/"
command =" -b /etc/"
command =" -b /proc/"
command =" -b /vendor"
command =" -b /data/dalvik-cache/"
command =" -b /property_contexts"
if [ -n "$(ls -A "$basedir"/binds)" ]; then
for f in $basedir/binds/* ;do
. "$f"
done
fi
command =" -w /data/data/com.termux/files/home/"
command =" /data/data/com.termux/files/usr/bin/env -i"
command =" HOME=/data/data/com.termux/files/home"
command =" PATH=/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets"
command =" TERM=$TERM"
command =" ANDROID_DATA=/data"
command =" ANDROID_ROOT=/system"
command =" EXTERNAL_STORAGE=/sdcard"
command =" LANG=$LANG"
command =" LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib"
command =" PREFIX=/data/data/com.termux/files/usr"
command =" TMPDIR=/data/data/com.termux/files/usr/tmp"
com="$@"
if [ -z "$com" ];then
eval "exec $command login"
else
eval "exec $command login -c "$com""
fi
Ошибка
./start.sh: line 39: unexpected EOF while looking for matching `"'
./start.sh: line 41: syntax error: unexpected end of file
Все двойные кавычки закрыты, почему он продолжает выдавать ошибку
Попытался запустить через sh вместо bash, но все равно ошибки
также он показывает ошибки по команде =» -b /system» о закрытии двойных кавычек может кто-нибудь объяснить?
Комментарии:
1. Проверьте свой сценарий с помощью shellcheck.
Ответ №1:
Перепроверьте строку:
eval "exec $command login -c "$com""
Вы должны избегать двойных кавычек в оболочке.
https://unix.stackexchange.com/questions/30903/how-to-escape-quotes-in-shell
Ответ №2:
Тебе это не нужно eval
. Используйте массивы для хранения аргументов команды.
#!/data/data/com.termux/files/usr/bin/bash
basedir=$(dirname "$0")
#unset LD_PRELOAD in case termux-exec is installed. If termux-exec is also installed inside the jail it will set again.
unset LD_PRELOAD
command="proot"
command_args=(
-r "$basedir/termux-fs"
-b /system
# etc
)
command_args =(-b /property_contexts)
shopt -s nullglob
for f in "$basedir"/binds/*; do . "$f"; done
command_args =(
-w /data/data/com.termux/files/home/
/data/data/com.termux/files/usr/bin/env -i
HOME=/data/data/com.termux/files/home
PATH=/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets
"TERM=$TERM"
# etc
login
)
if (( $# == 0 )); then
command_args =( -c "$@" )
fi
exec "$command" "${command_args[@]}"