执行输出作为文件名

Executing the output as filename

在我的一个 Bash 脚本中,有一点我有一个包含 /path/to/an/exe 的变量 SCRIPT,而脚本最终需要做的是执行它可执行。因此脚本的最后一行是

$($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 在这里似乎没有太大帮助。

与bash,只需使用$SCRIPT:

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

生产:

aze rty

它对我有用 sh -c:

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

它也顺利通过了 ShellCheck

$($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