2017-05-24 2 views
2

私は、冗長モードとサイレントモードの両方で実行できるスクリプトを作成したいと思う。私の考えは、"&> /dev/null"を含む変数を作成することでした。スクリプトがサイレントモードで実行されている場合、私はそれをクリアします。サイレントモードは正常に動作しますが、これを最後の「引数」として渡したい場合(私の例を参照)、動作しません。ここでBashの変数でSTDOUTをリダイレクト

は一例です: 私はzip何か(私は質問がよりtheorethicalのようなものです、-qオプションが存在しているはず)にしたいと、私はこれを書いている場合、それは私が意図したとおりに動作します。

$ zip bar.zip foo 
    adding: foo (stored 0%) 
$ zip bar.zip foo &> /dev/null 
$ 

しかし、私は、変数として&> /dev/nullを宣言するとき、私はこれを取得:

$ var="&> /dev/null" 
$ zip bar.zip foo "$var" 
zip warning: name not matched: &> /dev/null 
updating: foo (stored 0%) 

私が意図してスクリプトの一部をリダイレクトするために他のソリューションを見ましたが、私の考えは仕事ともしできない場合、私は好奇心が強い、wはこんにちは? 私が唯一のいくつかの行またはコマンドをリダイレクトする必要があるので、私のスクリプトでは、このようなものを使用する方が便利なもののifでそれぞれを囲むようにあまりにも多くなります

私は明確にするために、このような何かをしようとしている:

if verbose 
verbose="&> /dev/null" 
else 
verbose= 

command1 $1 $2 
command2 $1 
command3 $1 $2 $3 "$verbose" 
command4 
+0

eval: 'eval zip bar.zip foo" $ var "'を使用します。 – pynexj

+1

またはif文を使用します。コマンドを実行します。 elseコマンド>&/ dev/null; fi' – pynexj

+0

上記と以下で述べたように、私はすべてを 'if'sで囲み、' eval'は落胆させたくありません。 – Wax

答えて

3

bashあなたのかどうか、リダイレクトで使用する場合、標準出力として/dev/stdoutのファイル名を認識しますファイルシステムにそのようなエントリがあります。

# If an argument is given your script, use that value 
# Otherwise, use /dev/stdout 
out=${1:-/dev/stdout} 

zip bar.zip foo > "$out" 
0

問題はシェルによって実行される展開の順序です。変数はstdoutリダイレクトに置き換えられます。コマンドにコマンドを渡します。zip

zipコマンドを呼び出す前に、その変数を展開するシェルが必要です。これを行うには、evalを使用します。この変数は、変数の展開などで最初のパスとなります。未チェックの値がエクスプロイトをもたらすことができるように

eval zip bar.zip foo "$var"

しかしながら、evalを使用しての疲れであり、その使用は一般的に推奨されます。

ファイルディスクリプタを設定し、/ dev/null、実際のファイル、またはstdoutに設定することもできます。その後、これらのいずれかに行くべき各コマンドは次のようになります

zip bar.zip foo > 3

http://www.tldp.org/LDP/abs/html/io-redirection.html#FDREF

関連する問題