运行存储在 shell 变量中的命令

Ame*_*ina 7 shell zsh quoting variable

以下在我的 shell (zsh) 中有效:

> FOO='ls'
> $FOO
file1 file2
Run Code Online (Sandbox Code Playgroud)

但以下没有:

> FOO='emacs -nw'
> $FOO
zsh: command not found: emacs -nw
Run Code Online (Sandbox Code Playgroud)

即使emacs -nw直接调用Emacs 也能很好地打开。

为什么?

Sté*_*las 8

因为没有名为emacs -nw. 有一个调用的命令emacs,您可以向其传递一个-nw选项。

要存储命令,您通常使用函数

foo() emacs -nw "$@"
foo ...
Run Code Online (Sandbox Code Playgroud)

要存储多个参数,通常使用数组:

foo=(emacs -nw)
$foo ...
Run Code Online (Sandbox Code Playgroud)

要存储包含多个由空格分隔的单词的字符串并将其拆分为空格,您可以执行以下操作:

foo='emacs -nw'
${(s: :)foo} ...
Run Code Online (Sandbox Code Playgroud)

您可以依赖在 IFS 上执行的分词(IFS 默认包含空格、制表符、换行符和 nul):

foo='emacs -nw'
$=foo ...
Run Code Online (Sandbox Code Playgroud)


jim*_*mij 5

对于未来的读者,应该提到的是,执行此类操作的“标准”方法是eval评估存储在变量中的参数:

eval "$foo"
Run Code Online (Sandbox Code Playgroud)

还可以通过命令替换来计算表达式:

$(expr "$foo")
Run Code Online (Sandbox Code Playgroud)

echoed 变量(或以其他方式打印)也可以工作:

$(echo "$foo")
Run Code Online (Sandbox Code Playgroud)

这些方法至少在zsh和中工作得很好bash