web-dev-qa-db-ja.com

シェルスクリプトエラーメッセージを表示しない

シェルスクリプトでは、次の行を取得しました。

rm tempfl.txt
rm tempfl2.txt

これらが存在しない場合、エラーメッセージが表示されます。

rm: tempfl2.txt: No such file or directory
rm: tempfl.txt: No such file or directory

ファイルが存在する可能性があるため、常に表示されるとは限らないにもかかわらず、これらのメッセージのみを抑制する方法はありますか?

38

次の2つのオプションがあります。

rm警告を抑制する

$ rm tempfl.txt 2> /dev/null

スクリプト出力を/dev/nullにリダイレクトする

$ ./myscript.sh 2> /dev/null

後者には、スクリプトによって生成される他のすべての警告メッセージが表示されないという欠点があります。

58
kamituel

他の回答の状態として、command 2> /dev/nullを使用してcommandからのエラー出力を破棄できます。

しかし、ここで何が起こっているのでしょうか?

>は、出力のリダイレクトに使用される演算子です。 2は標準エラー出力ストリームへの参照です。つまり、2> =エラー出力をリダイレクトします。

/dev/nullは 'nullデバイス'で、提供された入力をすべて飲み込みます。この2つを組み合わせて、コマンドからの出力を効果的に破棄できます。

完全なリファレンス:

  • > /dev/null捨てるstdout
  • 1> /dev/null捨てるstdout
  • 2> /dev/null捨てるstderr
  • &> /dev/nullstdoutandstderrの両方を捨てます
9
davnicwil

このコマンドを試してください:

rm -f tempfl.txt

-fオプションは次のように機能します。

-f, --force  ignore nonexistent files, never Prompt

また、ファイルが存在しない場合、コマンドはゼロ以外のエラーコードを報告しません。

5

すべてのエラーメッセージを/ dev/nullにリダイレクトする必要があります

rm tempfl2.txt 2> /dev/null
5
developer

上記の回答に追加:エラーメッセージ(アクセス許可の拒否など)を保持することをお勧めします。削除する前にファイルの存在をテストするだけです。

[ -f file.txt ] && rm file.txt

これは、BashのようなシェルのようなBourneを想定しています。上記には、rmができないようなディレクトリを削除しようとしないという追加の利点があります。

3
mplwork

2> /dev/nullを使用して出力エラーを抑制し、|| trueを使用して正常終了ステータスを確認できます。

rm foo
=> rm: cannot remove ‘foo’: No such file or directory

rm foo 2> /dev/null
echo $?
=> 1

rm foo 2> /dev/null || true
echo $?
=> 0

シェルスクリプト、メイクファイルなどでコマンドを使用している場合は、おそらくこれが必要です。

0