これは機能します—
$ 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番目の例を機能させるにはどうすればよいですか?
コードを含む変数を実行する場合は、コマンドeval
を使用することがよくあります。これにより、変数の内容が拡張され、実行できるようになります。
$ x='grep a | grep b'
$ echo ab | eval "$x"
ab
ただし、evalの使用は推奨されないことが多いため、注意が必要です。その他の例については、次のタイトルのBashFAQを参照してください。 Evalコマンドとセキュリティの問題 !
ああ、私はいくつかの実験の後でそれを理解しました— alias
を使用してください—
$ x='grep a | grep b'
$ alias y=$x
$ echo ab | y
ab
これを行う他の方法を投稿してください—別の方法に興味があります。