将输出作为文件名执行

Posted

技术标签:

【中文标题】将输出作为文件名执行【英文标题】:Executing the output as filename 【发布时间】:2020-12-18 21:00:36 【问题描述】:

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

【问题讨论】:

【参考方案1】:

使用 bash,只需使用 $SCRIPT:

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

生产:

aze rty

【讨论】:

【参考方案2】:

sh -c 对我有用:

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

它也顺利通过了ShellCheck。

【讨论】:

【参考方案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

【讨论】:

数组case应该是"$SCRIPT[@]"; "$SCRIPT" 仅扩展为元素 [0]。 我刚刚明白,我写了一个问题,而我想问的不是这个问题。我迷失在间接中。然而,这是我提出的问题的正确答案。 Here's the correct question.

以上是关于将输出作为文件名执行的主要内容,如果未能解决你的问题,请参考以下文章

结合 AWS EMR 输出

反转文本文件中的任何行(执行rev命令)

Lua IO库

将输出重定向为不同的用户[重复]

Shell学习笔记

是否可以使用相同的输入文件作为管道命令的输出?