Bashでさまざまな作業を試しているのに理解できない動作を見つけました。
CODE="pwd";$CODE
このコードはうまく動作します。
CODE="pwd;pwd";$CODE
しかし、これはうまくいきません。 (明らかに、&&と同じように壊れています。)
どのようなアイデアがありますか?
答え1
シェルは$CODE
コマンドで実行されます。パスに名前が付いたコマンドを生成すると、そのpwd;pwd
コマンドが実行されます。これを実行するには、$CODE
次のようにシェルに明示的に入力します。
CODE="pwd;pwd";sh -c "$CODE"
答え2
変数の拡張は、コマンドラインの解析よりはるかに遅く発生します。この時点で、変数内の値はCODE
拡張されますが、シェルから再解析されません。また、内部値にCODE
IFS内の文字が含まれていない場合、値は分割されず、シェルは変数の内容全体を1つのコマンドで実行しようとします。もちろん、あなたの場合、PATHに呼び出された実行可能ファイルがなく、シェルができることは、env;env
そのファイルが見つからないというエラーを報告するだけです。
しかし、これはうまくいきます(bashでは)。
CODE="pwd;pwd"; sh -s <<<"$CODE"
環境変数として頻繁に使用される大文字変数は使用しないでください。その指針に従ってください。