Linuxでの標準出力と標準エラーのリダイレクト

サーバー上でコマンドを長時間実行する必要がある場合は、nohupコマンドがよく使用されます。このとき、リモートログインsshがサーバーとの接続を中断しても、サーバー上で実行されているコマンドが強制的に停止されることはありません。

通常、nohupは&と組み合わせて使用​​されます。これは、コマンドをバックグラウンドで実行することを意味します。次のように:

nohup example.sh &

exmaple.shを&に通してサーバーのバックグラウンドで実行すると、nohupは、現在のsshリモート接続が中断された場合でも、example.shが影響を受けず、リモートサーバーで実行し続けることができるようにします。

最近、参照ゲノムと比較する必要のある2つのペアシーケンスファイルがあり、bwaで完了することができます。同時に、ファイルが比較的大きく、実行時間が長いため、不安定なネットワーク接続によるsshの中断を回避するために、nohupを使用します。

nohup bwa mem ref.fa read1.fq.gz read2.fq.gz > read12.sam &

2つのシーケンスファイルを組み合わせて、samファイルを生成します。
コマンドを書いて、Enterキー「pop」を押してください。次に、そのままにしておきます。10時間以上経過すると、大きなファイルread12.samが生成されました。
ただし、samファイルを使用してbamファイルを生成すると、samファイルにエラーがあるというプロンプトが表示されます。[10時間以上の計算が無駄でした]
samファイルを注意深くチェックしたところ、プログラム実行の結果とプログラム実行中の指示が同じファイルに出力されていることがわかりました。

1.標準出力と標準エラー

標準出力(標準出力)は、bashなどの結果のデフォルトの出力場所です。

$ echo 'hello'
hello

デフォルトの状態では、「hello」の出力が端末(端末)に表示されます。
別の例として、catコマンドを使用してテキストファイルを表示します。

$ cat hello.txt
Hello!
This is a test!

ただし、テキストファイルが現在のパスに存在しない場合は、エラーが出力されます。

$ cat No_exist.txt
cat:No_exist.txt:そのようなファイルまたはディレクトリは
ありませんこの時点での出力コンテンツ「cat:No_exist.txt:そのようなファイルまたはディレクトリはありません」は標準エラーです。

2.出力をリダイレクトする

デフォルトでは、標準出力と標準エラーの両方が端末に表示されます。標準出力が端末に出力されず、別のファイルに出力される場合、今回はリダイレクトされた出力になります。これは、「>」記号を使用して実行できます。

echo 'hello' > hello.txt

hello.txtファイルに「hello」を出力すると、システムが新しいファイルを作成します。ファイルがパスに存在する場合、古いファイルは上書きされます。
「>>」記号を使用して、古いファイルが上書きされないようにし、「hello」を古いファイルに追加することもできます。
それで、ここに質問があります、端末へのすべての出力をファイルにリダイレクトできますか?たとえば、標準エラーの場合、「>」を介してファイルに入力できますか?

$ cat No_exist.txt > output.txt
cat: No_exist.txt: No such file or directory

結局のところ:いいえ!output.txtはまだ空のファイルであり、エラーの内容はファイルに表示されず、ターミナルに表示されたままになります。したがって、標準エラーを「>」から直接ファイルに出力することはできません。
では、標準エラーをファイルに出力するにはどうすればよいでしょうか。

3.ファイル記述子

bashでは、通常、標準入力(0)、標準出力(1)、および標準エラー(2)を表すために3つの整数が使用されます。
標準エラーをファイルに出力したい場合は、

cat No_exist.txt 2> tt.txt

このとき、tt.txtファイルに標準エラー「cat:No_exist.txt:No such fileordirectory」が表示されます。
同様に、標準エラーを標準出力にリダイレクトできます。2>&1
など

$ cat No_exist.txt 
cat: No_exist.txt: No such file or directory
$ cat No_exist.txt 2>&1
cat: No_exist.txt: No such file or directory

端末での出力は見た目は異なりますが、IDは異なります。1つ目は標準エラーとして出力され、2つ目は標準出力です。パイプ記号で違いを確認できます。

$ cat No_exist.txt | sed 's/or/and/'
cat: No_exist.txt: No such file or directory
$ cat No_exist.txt 2>&1| sed 's/or/and/'
cat: No_exist.txt: No such file and directory

これで違いがわかります。最初の標準エラーはパイプ記号を介して「and」に置き換えることはできず、2番目は標準出力です。パイプ記号を介して「or」を「and」に置き換えることができます。 。
同じ理由で、標準出力を標準エラー「1> 2&」にリダイレクトできます。

では、振り返ってみると、最初の質問を見てください。なぜnohupは計算結果と計算プロセスの説明を同じsamファイルに出力するのでしょうか。
簡単にするために、nohupのエラーは次のコード(example.sh)で再現されています。

#!/bin/bash

echo "this is outcome!"
sleep 1
echo "sleep for 1s" >&2
echo "this is outcome, too!"
sleep 2
echo "second sleep for 2s" >&2

スリーププロセスの説明は、>&2を介して標準エラーの形式で表示され、出力は標準出力の形式で出力されます。
通常の状況では、次を実行します。

$ ./example.sh > outcome.txt
sleep for 1s
second sleep for 2s

$ cat outcome.txt 
this is outcome!
this is outcome, too!

標準エラーは直接端末に出力され、実行結果は問題なくoutput.txtに出力されます。しかし、nohupの場合、この状況は変わりました。
nohupの説明では、「標準出力が端末にある場合、出力コンテンツは「nohup.out」ファイルに追加されます。標準エラー出力が端末にある場合、コンテンツはリダイレクトされます。標準出力」。これは、特に指定がない限り、標準出力と標準エラーが同じ場所にリダイレクトされることを意味します。次のように、

$ nohup ./example.sh 
appending output to nohup.out

$ cat nohup.out 
this is outcome!
sleep for 1s
this is outcome, too!
second sleep for 2s

nohup.txtファイルでは、必要な実行結果だけでなく、不要な実行プロセスも含まれています。これはまた、私のsamファイルにファイルに属するべきではないコンテンツがたくさんある理由を説明しています。
理由がわかったので、問題を解決することは難しくありません。出力をリダイレクトすることにより、実行結果と実行プロセスを異なるファイルに出力できます。

$ nohup ./example.sh 2>stderr.log 1>outcome.txt

$ cat stderr.log 
sleep for 1s
second sleep for 2s

$ cat outcome.txt 
this is outcome!
this is outcome, too!

このようにして、プロセスは標準エラーの形式でstderr.logに出力され、結果は標準出力の形式でoutput.txtに出力されます。
したがって、この記事の冒頭で述べたコマンドは次のように変更できます。

nohup bwa mem ref.fa read1.fq.gz read2.fq.gz 1> read12.sam 2>read12.log &

総括する

デフォルトの条件下では、標準エラーと標準出力は同じファイルにリダイレクトされます。ファイル記述子(0、1、2)を介して出力コンテンツを制御し、優れた出力制御習慣を開発して、標準出力と標準に変換します。エラーは別の方法で処理する必要があります。

=====終わり=====

参考資料:

https://robots.thoughtbot.com/input-output-redirection-in-the-shell#file-descriptors
https://www.brianstorti.com/understanding-shell-script-idiom-redirect/

Linuxでの標準出力と標準エラーのリダイレクト

おすすめ

転載: blog.51cto.com/15069450/2577375