bashリダイレクト 標準出力/エラー出力

bash
bashLinux

「>」の記号一つで手軽にログをファイル出力するのにリダイレクトはよく使います。シェルでコマンドを実行するとその結果が標準出力されますが、リダイレクトはその出力先を指定のファイルに変更することができます。

リダイレクト基本的な使い方 (上書き/追記)

$ シェルコマンド > “ファイル名” #上書き

$ シェルコマンド >> “ファイル名” #追記

$ ls                      #カレントディレクトリに2つのファイルがあります
sample1.txt sample2.txt

$ ls > hoge               #lsコマンドの結果をhogeに出力する(コンソールには出力されなくなる)

$ ls                      #hgoeというファイルが作成される
hoge        sample1.txt sample2.txt

$ cat hoge                #hgoeの中身は、lsの結果が記録されている(hoge自身のファイルもある) 
hoge
sample1.txt
sample2.txt

$ echo hello > hoge      #hogeに新しいコマンドの結果「hello」を上書きする

$ cat hoge               #以前のlsの結果は上書きされているのがわかる
hello

$ echo world >> hoge     #hogeに新しいコマンドの結果を追記する

$ cat hoge               #以前のコマンドの結果と今回のコマンドの結果が記録されている
hello
world

エラー出力

シェルコマンドを実行してコンソールに表示されるものには標準出力(1番)と標準エラー出力(2番)があります。普段は意識することないですが、リダイレクトでファイルに出力する際には、何を出力するのか意識する必要があります。1番や2番などのファイル記述子を使ってリダイレクトする種類を指定します。

ファイル記述子

 0:標準入力 1:標準出力 2:標準エラー出力

$ cat sample              #存在しないファイルを指定してわざとエラーを発生させます
cat: sample: No such file or directory

$ cat sample > hoge       #ファイル記述子を指定せずリダイレクトするとエラーはコンソールに表示される
cat: sample: No such file or directory

$ ls                      #それではリダイレクトしたhogeファイルは生成されているので中身を確認してみましょう
hoge        sample1.txt sample2.txt

$ cat hoge                #空っぽです。 

ファイル記述子を指定しない場合、1番(標準出力)がリダイレクトされることになっているんですね。ではファイル記述子を指定してリダイレクトしてみましょう。

$ cat sample1.txt 1>out 2>error       #標準出力を"out"に、標準エラーを"error"に出力します。正しいコマンドの時。

$ ls                                  #errorとoutの2つのファイルができました。
error       out         sample1.txt sample2.txt

$ cat out                             #outファイルに標準出力の結果が格納されています 
1000 apple
1000 banana
2000 alchole

$ cat error                           #errorファイルの中身は空っぽです
$ 
$ ca sample1.txt 1>out 2>error        #今度はわざと間違ったコマンドを実行します
$                                     #コンソールには何も表示されません
$ cat error                     #errorファイルに標準エラーが格納されています。
-bash: ca: command not found

実際よく使うのは、標準出力も標準エラーもまとめて一つのファイルに格納する方法です。この記述方法が覚えきれなくて、毎回ぐぐっちゃうんだよね。。。

$ シェルコマンド > “ファイル名” 2>&1

コメント

タイトルとURLをコピーしました