/ dev / nullへのリダイレクト


144

私はサンプルのbashシェルスクリプトを読んでいます:

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

# First remove the old bzip2 file.  Redirect errors because this generates some if the archive
# does not exist.  Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar

# Copy the file to another host - we have ssh keys for making this work without intervention.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> /home/franky/log/home_backup.log
echo backup succeeded >> /home/franky/log/home_backup.log

ここで「/ dev / null 2>&1」の使用を理解しようとしています。最初は、このスクリプトは/ dev / nullを使用して、スクリプトをクラッシュさせずにエラーを優雅に無視するように考えました(プログラミング言語で例外処理をキャッチするようなものです)。tarを使用してディレクトリをtarファイルに圧縮する方法がわからないため、あらゆるタイプのエラーが発生する可能性があります。


3
にリダイレクトして/dev/nullもクラッシュは防止されませんが、stdoutおよびstderrの出力ストリームはクリーンアップされます。tarさまざまな方法でエラーを引き起こす可能性があります。書き込みアクセス権がないか、ファイルが既に存在する可能性があります。
Sparhawk

3
不要な出力を避けるためのトリックです。tarがエラーを引き起こす理由について:ターゲットディレクトリが存在しないため、ソースが存在しないため、ターゲットへの書き込みアクセス権がないか、ソースへの読み取りtarがないため、$ PATHにないため、バージョンが変更され、ディスクがI / Oエラーを引き起こしたために異なる構文が必要tarになったため、デバイスにスペースが残っていないため、クラッシュしました(わかりません)tar。もっと見つけられると思います。
テルドン

回答:


223

いいえ、これはスクリプトのクラッシュを防止しません。tarプロセスでエラーが発生した場合(たとえば、許可が拒否された、そのようなファイルやディレクトリがないなど)、スクリプトはクラッシュします。

を使用> /dev/null 2>&1すると、すべてのコマンド出力(stdoutおよびstderr)がにリダイレクトされるため/dev/null、出力は端末に出力されません。

デフォルトでは:

stdin  ==> fd 0
stdout ==> fd 1
stderr ==> fd 2

スクリプトでは、> /dev/null原因を使用します:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2

そして、2>&1原因:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> stdout

3
理解の時点で> /dev/null 2>&1、このコマンドの結果はstderr ==> stdoutであるため、stderrはまだstdoutに出力されますか?
ウェイシZen

11
おそらくそれほど重要ではありませんが、何fdですか?
ケブ


7
なぜ:CMD > /dev/null 2>&1動作しますが、CMD 2>&1 > /dev/nullまだSTDERRが表示されますか?
-dbmikus

3
推奨:2>& 1コード例で使用して、数値とアンパサンドがリダイレクト演算子の一部と見なされることを強調してください。ファイルへのリダイレクトでは、>との間にスペースが存在するのが一般的/path/to/fileです。ファイル記述子へのリダイレクトも基本的に同じです。
ヘンクランゲ

21

ここで「> / dev / null 2>&1」の使用を理解しようとしています。

/dev/null質問の前にリダイレクトを追加したことに注意してください。)

上記のリダイレクトうSTDOUTSTDERRします/dev/null。これは、マージすることによって動作STDERRSTDOUT。(コマンドからの本質的にすべての出力nullデバイスにリダイレクトされます。)

...スクリプトをクラッシュさせずに(プログラミング言語で例外処理をキャッチしてみてください)。

それはまったく似ていませんtry/catch。コマンドからのあらゆる種類の出力(エラーを含む)を単に黙らせます。

tarを使用してディレクトリをtarファイルに圧縮する方法がわからないため、あらゆるタイプのエラーが発生する可能性があります。

次のようないくつかの理由でエラーが発生する可能性があります。

  • アーカイブしようとしているファイルまたは書き込みを試みているファイルに対する不適切なアクセス許可
  • アーカイブを作成するためのディスク容量の不足

よく説明されています。
アディティアグプタ

7

CMD> / dev / null 2>&1を実行すると

STDOUTは/ dev / nullにリダイレクトし、STDERRはSTDOUTのアドレスにリダイレクトします。これは/ dev / nullに設定されているため、STDOUTとSTDERRは両方とも/ dev / nullを指します

逆に、CMD 2>&1> / dev / nullを実行すると

STDERRはSTDOUTのアドレス(その瞬間のファイル記述子1、または/ proc / self / fd / 1)にリダイレクトし、STDOUTは/ dev / nullにリダイレクトしますが、STDERRはfd1にリダイレクトし続けます!! その結果、STDOUTからの通常の出力は破棄されますが、STDERRからのエラーはまだコンソールに書き込まれています。


-2

Bash I / Oリダイレクト

物事を片付ける主なアイデアはこれです:

リダイレクトは右から左に適用されます。これは、英語を話す人が通常読む方法とは逆です。


したがって、このコード:

command > filename 2>&1

最初にリダイレクトstderrし()、次に(リダイレクトされたを含む)を()に送信します。以下にABSGの説明を示します(20章)stdout 2>&1stdoutstderrfilename> filename

このコード:

command >>/dev/null 2>&1

リダイレクトstderrstdout/dev/nullすることを意味している... どこにも。に送信されたものは/dev/null、いかなる方法でも保存、キャッシュ、または記憶されません。

彼らはただ「どこにも」送られて忘れられています。これは、プログラムを実行し、それらが出力を生成しないことを確認する方法であり、コマンドラインまたはログファイルに表示されることはありません。


私はこの種の質問をかなり見ています...主に私は長年コーディングしていないので自分で調べなければならなかったからです。以下は、ABSGからの便利な情報です。

「リダイレクトとは、ファイル、コマンド、プログラム、またはスクリプトからの出力をキャプチャし、別のファイル、コマンド、プログラム、またはスクリプトへの入力として送信することを意味します。」

2>&1 
# Redirects stderr to stdout.

command >>filename 2>&1
# Appends both stdout and stderr
#+  to the file "filename" ...

ABSG:Advanced Bash Scripting Guide:上記の第20章のリンクは、Mendel CooperによるAdvanced Bash Scripting Guideと呼ばれるオープンソースのtldp.orgドキュメントのI / Oリダイレクトページへのリンクです。それは「シェルスクリプトの技術の詳細な調査」としてリストされており、私は絶対に同意します。それは素晴らしいリソースであり、あらゆる種類のクレイジーな状況に対する答えがたくさんあります。

その他の貴重なリソース:Linux Documentation Project Guidesページの現在/維持されているセクション(html、pdf、テキストなどのいくつかの便利な形式)には多くの貴重なリソースがあります。ここに私が便利だと思ったいくつかがあります:


1
いいえ、リダイレクトは左から右に処理されます。あなたの例では、標準出力はにリダイレクトされfilename、標準エラーは標準出力が現在行っている場所(filename)にリダイレクトされます。逆の場合、標準エラーのみが端末にリダイレクトされ、標準エラーのみが端末にリダイレクトされfilenameます。また、中command >file1 2>file2file2場合に作成されないfile1(かどうかに関係なく作成できませんでしたfile1し、file2実際には全く異なるパス名でした)。
クサラナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.