標準出力と標準エラー出力についてメモ


毎回調べ直すことになっているので、メモメモ。さらに調べるのにまとまったサイトがなくて1つ1つ調べるはめになるので。まとめ
シェルによって違いがあるため今回はbashに限る

前提知識

【知識0】
unixコマンドは左から右に処理される。これは絶対

【知識1】
(標準入力 : 0)
標準出力 : 1 ※画面に出力される
標準エラー出力 : 2 ※画面に出力される

【知識2】
0,1,2はファイルディスクリプタと呼ぶ

【知識3】
「>」リダイレクト
シェルの結果を出力する場所を指定可能

command ファイル・ディスクリプタ> 出力先

※commandは何らかのコマンドかshファイルとしている

【知識4】
出力先などを特定のファイルディスクリプタに送りたい場合は「&ファイル・ディスクリプタ」とする

echo "standard output" >&2

【知識5】
/dev/nullはunixのスペシャルファイルで空ファイルの事

例えば下記はhoge.txtファイルを空にする

cat /dev/null > hoge.txt

標準出力とは

単純に画面に出力する文字列のこと(実行結果)

#!/bin/bash
echo 'standard output'

標準エラー出力とは

シェルで実行時に発生したエラー・メッセージのこと(実行した結果コマンドエラーとなった出力)

標準出力ではなく標準エラー出力として出力する

#!/bin/bash
echo 'standard error output' 1>&2

標準エラー出力のみ出力する

標準出力と標準エラー出力が表示される場合に標準エラー出力のみを表示する

#!/bin/bash
command > /dev/null

※commandは何らかのコマンドかshファイルとしている

標準出力も標準エラー出力も出力しない

標準出力と標準エラー出力が表示される場合に標準エラー出力のみを出力する

#!/bin/bash
command > /dev/null 2>&1

※commandは何らかのコマンドかshファイルとしている

1>&2

1の出力先を2の出力先にマージする ではなく 1の出力先を2の出力先と同じものに設定する ということらしい

「x>&y」は「x の出力先をyの出力先と同じものに設定する」が正しい

実践

■リダイレクトなしの場合

#!/bin/bash
command

※commandは何らかのコマンドかshファイルとしている

標準出力 : 画面
標準エラー出力 : 画面

■標準出力のみファイルにリダイレクトする場合

#!/bin/bash
command 1>file

※commandは何らかのコマンドかshファイルとしている

標準出力 : file
標準エラー出力 : 画面

■標準出力と標準エラー出力をファイルにリダイレクトする場合

#!/bin/bash
command 1>file 2>&1

※commandは何らかのコマンドかshファイルとしている

標準出力 : file
標準エラー出力 : file

これはunixコマンドは左から右に処理されるため、まずは1>fileから処理される

標準出力 : file
標準エラー出力 : 画面

そして2>&1が処理されるため2の出力先を1の出力先と同じに設定したため

標準出力 : file
標準エラー出力 : file

このようになる

ここら辺を追って理解できれば知識として問題なしとしておこう

その他おすすめの備忘録

Tagged with:
 

5 Responses to [Bash]標準出力・標準エラー出力の全て(1>&2とか)まとめ

  1. oppara より:

    標準出力・標準エラー出力の全て(1>&2とか)まとめ | Memorandum blog B!

  2. ryota-murakami より:

    1>&2が解らず辿り着いたが、必要な前提知識が全て書かれている。技術ブログの教科書のようなエントリ。

  3. Dai_Kamijo より:

    1>&2が解らず辿り着いたが、必要な前提知識が全て書かれている。技術ブログの教科書のようなエントリ。 / “[Bash]標準出力・標準エラー出力の全て(1>&2とか)まとめ | Memorandum blog” — Ryota Murakami (@malloc007) February

  4. stealthinu より:

    「1>&2」の意味をはじめてちゃんと理解できたわ。標準出力(ファイルデスクリプタ1)を標準エラー出力(2)と同じところへ向ける、という意味なのね。数字の前の「&」はファイルディスクリプタであることを意味してるのね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>