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

В одном из моих 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 тут не особо поможет.


person Enlico    schedule 30.08.2020    source источник


Ответы (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
person Léa Gris    schedule 30.08.2020
comment
Случаев массива должно быть "${SCRIPT[@]}"; $SCRIPT" расширяется только до элемента [0]. - person dave_thompson_085; 30.08.2020
comment
Я только что понял, что написал вопрос, отличный от того, который хотел задать. Я заблудился в косвенных выражениях. Однако это правильный ответ на вопрос, который я задал. Вот правильный вопрос. - person Enlico; 30.08.2020

У меня это сработало с sh -c:

$ chrome="/opt/google/chrome/chrome" 
$ sh -c "$chrome"
Opening in existing browser session.

Он также без проблем прошел ShellCheck.

person Hedi Bejaoui    schedule 30.08.2020

с bash просто используйте $SCRIPT:

cat <<'EOF' > test.sh
SCRIPT='echo aze rty'
$SCRIPT
EOF
bash test.sh

производить:

aze rty
person Cyril Jouve    schedule 30.08.2020