web-dev-qa-db-ja.com

パイプを含む文字列のコマンド置換へのパイピング

これは機能します—

$ x='grep a'
$ echo ab | $x
ab

これはしません—

$ x='grep a | grep b'
$ echo ab | $x
grep: |: No such file or directory
grep: grep: No such file or directory
grep: b: No such file or directory

後者の場合、grep a | grep bは単一のコマンドと見なされますつまりgrep a \| grep b

xを変更せずに2番目の例を機能させるにはどうすればよいですか?

5
Andrew Cheong

コードを含む変数を実行する場合は、コマンドevalを使用することがよくあります。これにより、変数の内容が拡張され、実行できるようになります。

$ x='grep a | grep b'
$  echo ab | eval "$x"
ab

ただし、evalの使用は推奨されないことが多いため、注意が必要です。その他の例については、次のタイトルのBashFAQを参照してください。 Evalコマンドとセキュリティの問題

参考文献

5
slm

ああ、私はいくつかの実験の後でそれを理解しました— aliasを使用してください—

$ x='grep a | grep b'
$ alias y=$x
$ echo ab | y
ab

これを行う他の方法を投稿してください—別の方法に興味があります。

2
Andrew Cheong