Выполнение вывода как имени файла
В одном из моих сценариев Bash есть точка, в которой у меня есть переменная SCRIPT
который содержит /path/to/an/exe
, и что в конечном итоге нужно сделать сценарию, так это выполнить этот исполняемый файл. Следовательно, последняя строка сценария
$($SCRIPT)
так что $SCRIPT
расширяется до /path/to/an/exe
, а также $(/path/to/an/exe)
выполняет исполняемый файл.
Однако бег shellcheck
на скрипте возникает эта ошибка:
In setscreens.sh line 7:
$($SCRIPT)
^--------^ SC2091: Remove surrounding $() to avoid executing output.
For more information:
https://www.shellcheck.net/wiki/SC2091 -- Remove surrounding $() to avoid e...
Есть ли способ переписать это $($SCRIPT)
более подходящим способом? eval
здесь не очень помогает.
3 ответа
$($SCRIPT)
действительно не делает то, что вы думаете.
Внешний $()
выполнит любые команды внутри круглых скобок и выполнит строку результата.
Внутренний $SCRIPT
расширится до значения SCRIPT
переменную и выполнить эту строку, разделяя слова на пробелы /
Если вы хотите выполнить команду, содержащуюся в SCRIPT
переменную, вы просто напишите в качестве примера:
SCRIPT='/bin/ls'
"$SCRIPT" # Will execute /bin/ls
Теперь, если вам также нужно обрабатывать аргументы с помощью вашего SCRIPT
вызов переменной команды:
SCRIPT='/bin/ls'
"$SCRIPT" -l # Will execute /bin/ls -l
Чтобы также динамически хранить или создавать аргументы, вам понадобится массив вместо строковой переменной.
Пример:
SCRIPT=(/bin/ls -l)
"${SCRIPT[@]}" # Will execute /bin/ls -l
SCRIPT+=(/etc) # Add /etc to the array
"${SCRIPT[@]}" # Will execute /bin/ls -l /etc
Это сработало для меня с sh -c
:
$ chrome="/opt/google/chrome/chrome"
$ sh -c "$chrome"
Opening in existing browser session.
Он также прошел ShellCheck без каких-либо проблем.
С bash просто используйте $SCRIPT:
cat <<'EOF' > test.sh
SCRIPT='echo aze rty'
$SCRIPT
EOF
bash test.sh
производить:
aze rty