执行由执行名称在变量中的脚本产生的命令

Execute command that results from execution of a script whose name is in a variable

最初发布这个问题时,我完全用错了它,获得了另一个合理但不同的问题,该问题得到了正确回答

以下是我原本想问的问题的正确版本。

在我的一个 Bash 脚本中,有一点我有一个变量 SCRIPT,其中包含 /path/to/an/exe,执行时会输出 line to be executed

我的脚本最终需要做的是执行 line to be executed。因此脚本的最后一行是

$($SCRIPT)

所以 $SCRIPT 扩展为 /path/to/an/exe,并且 $(/path/to/an/exe) 执行可执行文件并返回 line to be executed,然后执行。

但是,脚本中的 运行 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 在这里似乎没什么用。

你可以在 2 steps

command_from_SCRIPT=$($SCRIPT)
$command_from_SCRIPT

并且在 shellcheck 中是干净的

您可以通过在 shell 中将要执行的命令设置为位置参数并从命令行执行它来简化它

set -- "$SCRIPT"

现在 运行 通过在 command-line 上执行下面的操作 SCRIPT 获得的结果。

"$@"

这适用于 SCRIPT 的输出包含多个单词的情况,例如需要 运行 的自定义标志。由于这是 运行 在您当前的交互 shell 中,请确保 运行 的命令不容易受到代码注入的攻击。你可以小心翼翼地 运行 你的命令在 sub-shell 内,不要让你的父环境受到 ( "$@" ; )

的影响

或使用shellcheck disable=SCnnnn禁用警告并借此机会对明确意图发表评论,而不是通过隐藏在中间变量或参数数组后面来逃避检测。

#!/usr/bin/env bash

# shellcheck disable=SC2091 # Intentional execution of the output
"$("$SCRIPT")"

通过注释禁用 shellcheck,阐明了意图并告诉有问题的代码不是错误,而是明智的实现设计选择。

如果脚本输出shell命令行执行,正确的做法是:

eval "$("$SCRIPT")"

$($SCRIPT) 只有在可以仅使用单词拆分和路径名扩展来完全评估命令的情况下才会碰巧起作用,这通常是一种罕见的情况。如果程序改为输出例如grep "Hello World"cmd > file.txt 那么您将需要 eval 或等价物。