1. ホーム
  2. shell

[解決済み] 変数に格納されたコマンドを実行するにはどうすればよいですか?

2023-05-27 20:27:27

質問

変数に格納されたコマンドを呼び出す正しい方法は何ですか?

1と2の違いは何ですか?

#!/bin/sh
cmd="ls -la $APPROOTDIR | grep exception"

#1
$cmd

#2
eval "$cmd"

どのように解決するのですか?

Unix シェルは、実行する前に入力の各行に対して一連の変換を行います。 ほとんどのシェルでは、次のようなものです (以下のドキュメントから引用されています。 Bash マニュアルページ ):

  • 初期単語分割
  • ブレース展開
  • チルダ展開
  • パラメータ、変数、算術演算の展開
  • コマンド置換
  • 二次単語分割
  • パス展開 (別名グロビング)
  • 引用符除去

使用方法 $cmd を直接使うと、パラメータ展開の段階であなたのコマンドに置き換えられ、その後のすべての変換を受けます。

使用方法 eval "$cmd" は引用除去の段階まで何もしません。 $cmd はそのまま返され、パラメータとして eval へのパラメータとして渡されます。

つまり、基本的にはほとんどの場合同じで、コマンドがパラメータ展開までの変換ステップを使用する場合に異なります。 たとえば、ブレース展開を使用する場合です。

$ cmd="echo foo{bar,baz}"

$ $cmd
foo{bar,baz}

$ eval "$cmd"
foobar foobaz