[シェル] - シェル スクリプトを呼び出した後の「2>&1」およびその他のリダイレクト文字の追加を理解する方法


1. 展望

シェルでスクリプトを呼び出してバックグラウンドで実行すると、実行中のログ ファイルが .log ファイルに書き込まれます。 2>&1は .log の後に追加されることが多く、最後の **&** は​​このコマンドをバックグラウンドで実行することを意味します。

nohup sh /root/model_name/script/black_table_stat.sh > /root/model_name/log/black_table_stat_1_$(date +"%Y%m%d%H").log 2>&1 &

次に、Linux の 0、1、2 の意味を理解する

名前 コード オペレーター
標準入力 0 < または <<
標準出力 1 >、>>、1>または1>>
標準エラー出力 2 2> または 2>>

例:
現在のディレクトリに test.txt ファイルはありますが、b.txt ファイルはありません。

[wqf@b1i10 ~]$ ls test.txt
test.txt
[wqf@b1i10 ~]$ ls b.txt
ls: cannot access b.txt: No such file or directory

正常な内容はファイル file.out に出力され、エラーの内容はファイル file.err に出力されます。

[wqf@b1i10 ~]$ ls test.txt b.txt 1>file.out 2>file.err
[wqf@b1i10 ~]$ cat file.out
test.txt
[wqf@b1i10 ~]$ cat file.err
ls: cannot access b.txt: No such file or directory

3. 各種リダイレクトの意味

1. 2>&1の意味

意味:標準エラー出力を標準出力にリダイレクトする
記号 >& はリダイレクト記号で、標準エラー出力が標準出力に追加されることを示します。
1.
元々は1(標準出力)が画面に出力されている
2、>logを実行し、1(標準出力)をログファイルに出力
3、2>&1を実行、1に2(標準出力)を加える(標準出力)、1 (標準出力) はログ ファイルに出力されるため、2 (標準エラー出力) もログを指します。

例えば:

nohup sh /root/model_name/script/black_table_stat.sh > /root/model_name/log/black_table_stat.log 2>&1 &

black_table_stat.log を表示すると、通常の出力内容とエラー出力内容の両方があることがわかります。

2.&>fileの意味

1 (標準出力) と 2 (標準エラー出力) の両方をファイル file にリダイレクトします。これは **>log 2>&1** と同じ意味です。

例えば:

nohup sh /root/model_name/script/black_table_stat.sh > /root/model_name/log/black_table_stat_1_$(date +"%Y%m%d%H").log 2>&1 &

## 可以简写为以下:
nohup sh /root/model_name/script/black_table_stat.sh &> /root/model_name/log/black_table_stat_1_$(date +"%Y%m%d%H").log &

セマンティクスに違いはありません。通常は最初のタイプを使用します。通常は最初のタイプを使用します。">log 2>&1"

3. 1>&2の意味

意味:標準出力を標準エラー出力にリダイレクトする
記号 >& はリダイレクト記号で、標準エラー出力が標準出力に追加されることを意味します。
これは次のように理解できます。
1. 本来は 1 (標準出力) が画面に出力されます。
2. >logを実行し、ログファイルに1(標準出力)を出力します。
3. 1>&2 を実行し、2 (標準エラー出力) がまだ画面を指しているため、1 (標準出力) を 2 (標準エラー出力) に加算します。

ターミナルでコマンドエラー画面を入力するとエラーが報告されますが、画面上でエラー報告が表示される場所が標準エラー出力チャンネル2とみなすことができます。
例えば:

[wqf@b1i10 ~]$ sh /apps/summary_fz_province/test.sh > /apps/summary_fz_province/test.log 1>&2
$*=
$@=
print each param from 
print each param from 

結果を実行し、test.log に何もないことを確認すると、test.sh を実行した通常の内容が画面に出力されます。

4. /dev/nullの意味

/dev/null は、書き込みが破棄される特殊なファイルであり、読み取りを試みても何も読み込まれません。

標準出力と標準エラー出力をブロックしたい場合は、次のように記述できます。

command > /dev/null 2>&1

1.
本来は1(標準出力)が画面に出力される
2. > /dev/nullを実行し、1(標準出力)が/dev/nullファイルに出力される
3. 2>&1を実行し、 1 (標準出力) は /dev/null ファイルに出力されるため、2 (標準エラー出力) も /dev/null を指します。

おすすめ

転載: blog.csdn.net/sodaloveer/article/details/130349575