2

シェル スクリプト内で繰り返し使用する必要があるコマンドがあります。このコマンドにはパイプが含まれており、コマンド全体の出力が他のコマンドにパイプされます。

たとえば、簡単にするために、コマンドがls | tee. 次に、それを他のコマンドにパイプするかもしれませls | tee | someprogramls | tee | anotherprogram

したがって、当然、保持したいls | teeのは変数です。問題は、パイプを含む変数を実行できないように見えることです。

#!/bin/sh
TEST="ls | tee"
$TEST

次の出力が得られます

ls: cannot access |: No such file or directory
ls: cannot access tee: No such file or directory

上記のような変数を実行するにはどうすればよい$TESTですか?出力を他のコマンドにパイプできますか?

4

1 に答える 1

4

短い答えはevalです。

eval $TEST somefile

eval $TEST otherfile | more

evalただし、特殊文字や空白などを引用する際の問題を意味することに注意する必要があります。すべてが単純な場合 ( TEST="ls -l | tee")、それは簡単です。引数またはシェルのメタ文字にスペースがある場合、それを正しく行うのは非常に困難です。その時点で、関数または別のシェル スクリプトを作成する方がよいでしょう。

その場合でも、関数またはシェル スクリプトを使用した方がよい場合があります。

ユーザーからの文字列の場合evalは、さらに心配する必要があります。

于 2012-07-21T23:29:58.550 に答える