微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

执行命令的结果是执行名称在变量中的脚本

如何解决执行命令的结果是执行名称在变量中的脚本

最初发布此问题时,我完全打错了字眼,得到了另一个合理但不同的问题,here得到了正确答案。

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

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

解决方法

您可以通过将命令设置为在外壳程序中作为位置参数执行并从命令行执行它来简化操作

set -- "$SCRIPT"

现在,通过在命令行上执行以下操作,运行通过扩展SCRIPT获得的结果。

"$@"

SCRIPT的输出包含多个单词(例如,需要运行的自定义标志。由于此命令是在当前的交互式Shell中运行的,因此请确保要运行的命令不容易受到代码注入的攻击。您可以采取一个谨慎的步骤,并在子外壳程序中运行命令,以免让您的父环境受到( "$@" ; )

的影响 ,

如果脚本输出要执行的Shell命令行,则正确的方法是:

eval "$("$SCRIPT")"

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

,

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

#!/usr/bin/env bash

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

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

,

您可以在2 steps

中进行操作
command_from_SCRIPT=$($SCRIPT)
$command_from_SCRIPT

它在shellcheck中很干净

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。