パラメータへのパイプのエスケープ解除

パラメータへのパイプのエスケープ解除

2つの引数を受け取り、コマンドで実行し、出力をファイルにダンプするbashスクリプトを作成したいと思います。myscript.shコンテンツ:

$1 > file1.tmp
$2 > file2.tmp

これは次の例でうまく機能します。

myscript.sh 'echo Hello World' 'echo Hello World 2'

file1.tmpこれでテキストが含まれ、Hello Worldテキストfile2.tmpが含まれます。Hello World 2

ただし、パイプを含むコマンドを使用すると失敗します。

myscript.sh 'ls | grep stuff' 'ls | grep morestuff'

ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access stuff: No such file or directory
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access morestuff: No such file or directory

次のコマンドを実行すると、最初のエラーに似た出力が表示されるため、パイプがエスケープされているようです。

ls \|

ls: cannot access |: No such file or directory

スクリプトからパイプをエスケープ解除する方法は?

ベストアンサー1

シェルコードスニペットをスクリプトに渡しています。スクリプトでは、これは単なるテキストです。これを完全なシェルコマンドとして解釈するには、次の手順を実行するeval必要があります。

eval "$1" >file1.tmp
eval "$2" >file2.tmp

$1$2これは単純なことで動作しますecho hello簡単なコマンド(リストや複合命令ではない)

他のプログラミング言語との比喩は、CコードをCプログラムにテキスト文字列として渡す場合です。コードは、プログラムの一部として実行される前に何らかの方法でコンパイル(およびリンク)する必要があります。

おすすめ記事