- ベストアンサー
【sed】変数に格納したコマンドの実行方法
- 変数に格納したsedコマンドを実行するにはどのようにすればいいでしょうか?
- 質問内容は、変数に格納したsedコマンドを実行する際に発生するエラーについてです。
- シェルスクリプトを使用してsedコマンドを実行している場合、変数内のコマンドを正しく実行する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
No1です。 その理解で合ってます。 それら3処理以外にも * 等のファイルマッチの展開や、" ' \ によるクォート外しとかありますが。
その他の回答 (1)
- notnot
- ベストアンサー率47% (4900/10359)
$CMDの変数展開の前にリダイレクトの解釈がされるので、>/tmp/data2 がファイルへのリダイレクト指定で無く、>まで含めたファイル名として扱われます。 変数内のリダイレクトを処理するためには、evalが必要。evalするので$にはクォートが必要。 $ CMD='sed -e \$d /tmp/data >/tmp/data2' $ echo $CMD sed -e \$d /tmp/data >/tmp/data2 $ eval $CMD
お礼
早々の回答ありがとうございます。 回答頂きました通り、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 以上、よろしくお願いします。
お礼
>それら3処理以外にも * 等のファイルマッチの展開や、" ' \ によるクォート外しとかありますが。 なるほど、他の処理については機会があったら調べてみます。 本件解決しましたのでBAとさせて頂きます。 迅速な回答大変有難うございました。