• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【sed】変数に設定したコマンドの実行について)

【sed】変数に格納したコマンドの実行方法

このQ&Aのポイント
  • 変数に格納したsedコマンドを実行するにはどのようにすればいいでしょうか?
  • 質問内容は、変数に格納したsedコマンドを実行する際に発生するエラーについてです。
  • シェルスクリプトを使用してsedコマンドを実行している場合、変数内のコマンドを正しく実行する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

No1です。 その理解で合ってます。 それら3処理以外にも * 等のファイルマッチの展開や、" ' \ によるクォート外しとかありますが。

Reghorn
質問者

お礼

>それら3処理以外にも * 等のファイルマッチの展開や、" ' \ によるクォート外しとかありますが。 なるほど、他の処理については機会があったら調べてみます。 本件解決しましたのでBAとさせて頂きます。 迅速な回答大変有難うございました。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

$CMDの変数展開の前にリダイレクトの解釈がされるので、>/tmp/data2 がファイルへのリダイレクト指定で無く、>まで含めたファイル名として扱われます。 変数内のリダイレクトを処理するためには、evalが必要。evalするので$にはクォートが必要。 $ CMD='sed -e \$d /tmp/data >/tmp/data2' $ echo $CMD sed -e \$d /tmp/data >/tmp/data2 $ eval $CMD

Reghorn
質問者

お礼

早々の回答ありがとうございます。 回答頂きました通り、evalコマンドをかませることで動作することを確認致しました。 >$CMDの変数展開の前にリダイレクトの解釈がされるので、>/tmp/data2 がファイルへのリダイレクト指定で無く、>まで含めたファイル名として扱われます。 細かな話で申し訳無いのですが、この部分が理解できていません。 次のような解釈で合っていますでしょうか?(散らかった文章ですいません) (1)通常シェルは次の順にコマンドを処理する。 ・リダイレクトの解釈 ・変数の展開 ・コマンドの実行 (2)今回の実装2では「リダイレクトの解釈」の時点で$CMDが展開されていなかったため   $CMDのリダイレクト部分は、sedの変数の1つとして扱われた。 (3)evalコマンドを使用することで、上記3処理が2回走り、次のような処理になったためうまく動いた。 ・リダイレクトの解釈 … eval $CMDのためリダイレクトなし ・変数の展開 … eval sed -e \$d /tmp/data >/tmp/data2 ・コマンドの実行 … ※evalの引数でもう一周 ・リダイレクトの解釈 … sed -e $d /tmp/data >/tmp/data2 のためdata2に書き込み ・変数の展開 … 変数なし ・コマンドの実行 … sed -e $d /tmp/data >/tmp/data2 以上、よろしくお願いします。