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

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

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

> FOO='ls'
> $FOO
file1 file2

但以下情况则不然:

> FOO='emacs -nw'
> $FOO
zsh: command not found: emacs -nw

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

为什么?

答案1

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

为了存储命令,通常使用功能:

foo() emacs -nw "$@"
foo ...

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

foo=(emacs -nw)
$foo ...

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

foo='emacs -nw'
${(s: :)foo} ...

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

foo='emacs -nw'
$=foo ...

答案2

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

eval "$foo"

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

$(expr "$foo")

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

$(echo "$foo")

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

相关内容