2つのコマンドを評価する方法は?

2つのコマンドを評価する方法は?

これを実行すると:

echo "echo 'a'; echo 'b'"

これにより、実行できる文字列が生成され動作しますa\nb\n。エコーが発生します。

しかし、これはうまくいきません。

$(echo "echo 'a'; echo 'b'")

なぜできないの?エコーだけでなく、どのコマンドでも機能しません。複数のコマンドを含む文字列を実行するには?

ベストアンサー1

シェルでの$(echo "echo 'a'; echo 'b'")コマンドの置き換えを参照してください。それはすべてです。したがって、これは拡張コマンドを置き換えるときの引数がSplit + Glob演算子の結果である単純なコマンドです。

シェルはコマンドの出力を取りますecho "echo 'a'; echo 'b'"。この場合は、echo 'a'; echo 'b'\n末尾の改行文字を削除して行き、echo 'a'; echo 'b'変数の値に応じて分割します$IFS

$IFSデフォルト値が変更されない場合は、echo4'a';ワードechoになります'b'。これらの各単語はワイルドカード文字の影響を受けます。これにはワイルドカード文字は含まれていないため、単語はそのまま残ります。

したがって、単純なコマンドを実行するための4つのパラメータがあります。最初の引数は、実行するコマンドを派生させるために使用されます。echoほとんどのシェルにはこれが組み込まれています。したがって、シェルはechoこの4つのパラメータを使用して組み込み関数を呼び出します。

echo最初の(0番目)引数を無視し、空白文字で区切られ、改行文字で終わる別の引数を出力します。いくつかのecho実装はバックスラッシュエスケープシーケンスを拡張しますが、ここではそうではありません。したがって、echo出力は次のようになります。

'a'; echo 'b'\n

これを評価するには、つまり文字列をシェルコードとして解釈するには、次のようにしますeval

eval "echo 'a'; echo 'b'"

これも簡単なコマンドと見なされます。引用符のためeval、シェルには2つの「単語」が表示されますecho 'a'; echo 'b'。同様に、これは最初のコマンドから派生したコマンドの引数を形成します。

ここにあるコマンドはevalシェルに組み込まれたコマンドです。もう一度eval最初の引数を無視します。これが行うことは、別の引数(ここでは1つのみ)を空白で連結し、結果の文字列をシェルコードとして解釈することです。通訳するとき

echo 'a'; echo 'b'

シェルは、;コマンドを区別するために引用されていないコマンドを表示します。最初は単純なコマンドで処理され、最終的にecho2つの引数で呼び出されます...など。

おすすめ記事