Выполнение вывода как имени файла

В одном из моих сценариев 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
Другие вопросы по тегам