シェル変数に格納されたコマンドの実行

シェル変数に格納されたコマンドの実行

以下は私のシェル(zsh)で動作します。

> FOO='ls'
> $FOO
file1 file2

次の場合はそうではありません。

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

直接呼び出しても、emacs -nwEmacsはうまく開きます。

なぜ?

答え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

関連情報