変数に複数のコマンドを保存できないのはなぜですか?

変数に複数のコマンドを保存できないのはなぜですか?

Bashでさまざまな作業を試しているのに理解できない動作を見つけました。

CODE="pwd";$CODE

このコードはうまく動作します。

CODE="pwd;pwd";$CODE

しかし、これはうまくいきません。 (明らかに、&&と同じように壊れています。)
どのようなアイデアがありますか?

答え1

シェルは$CODEコマンドで実行されます。パスに名前が付いたコマンドを生成すると、そのpwd;pwdコマンドが実行されます。これを実行するには、$CODE次のようにシェルに明示的に入力します。

CODE="pwd;pwd";sh -c "$CODE"

答え2

変数の拡張は、コマンドラインの解析よりはるかに遅く発生します。この時点で、変数内の値はCODE拡張されますが、シェルから再解析されません。また、内部値にCODEIFS内の文字が含まれていない場合、値は分割されず、シェルは変数の内容全体を1つのコマンドで実行しようとします。もちろん、あなたの場合、PATHに呼び出された実行可能ファイルがなく、シェルができることは、env;envそのファイルが見つからないというエラーを報告するだけです。

しかし、これはうまくいきます(bashでは)。

CODE="pwd;pwd"; sh -s <<<"$CODE"

環境変数として頻繁に使用される大文字変数は使用しないでください。その指針に従ってください。

関連情報