首页 > 解决方案 > 将输出作为文件名执行

问题描述

在我的一个 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在这里似乎没有太大帮助。

标签: bashcommand-substitutionindirectionshellcheckmultiple-indirection

解决方案


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

推荐阅读