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プログラムにテキスト文字列として渡す場合です。コードは、プログラムの一部として実行される前に何らかの方法でコンパイル(およびリンク)する必要があります。