リダイレクトしたい(>)

// 標準出力をファイルに保存
$ コマンド 1> ファイル名

// 標準出力をファイルに追記
$ コマンド 1>> ファイル名

// 標準出力と標準エラー出力を別々に保存
$ コマンド 1> ファイル1 2> ファイル2

コマンドの実行結果は 標準出力(stdout)と 標準エラー出力(stderr)に出力されます。

実行結果は>でリダイレクトできます。 1>は標準出力のリダイレクト、 2>は標準エラー出力のリダイレクトです。

注釈

>は、1>の短縮形です。 このページでは、すべて1>と書くことにします。

参考

標準出力(stdout)と標準エラー出力(stderr)の区別は、Unixの初期からある概念です。 Unix哲学のひとつに「ひとつのことをうまくやる」というものがあり、あるコマンドの実行結果は、パイプ処理によって次のコマンドに渡すことができます。 このとき、実行エラーなどが混ざってしまうと、次のコマンドがスムーズに処理できません。

そのため、 標準出力には次の処理で利用できる結果を、 標準エラー出力には実行エラーや進捗状況など人間が確認するための情報を、 それぞれ出力できるようになっています。

この使い分けは、自作スクリプトを書くときにも意識しておくとよいことです。

標準入力したい(<)

$ コマンド < ファイル名

stdinは、コマンドが入力を受け取る先です。 標準入力(/dev/stdin)のファイルディスクリプターはfd = 0に割り当てられているため、<でリダイレクトできます。

複数行のテキストをその場で入力したい場合は、ヒアドキュメント(<<)が使えます。

$ コマンド <<EOF
1行目
2行目
EOF

終端の文字列(ここではEOF)は任意の文字列を指定できます。 入力した終端の文字列が現れるまでの内容が、そのまま標準入力として渡されます。

1行の文字列だけを渡したい場合は、ヒアストリング(<<<)が使えます。

$ コマンド <<< "文字列"

標準出力したい(1>)

$ コマンド 1> ファイル名
$ コマンド 1>> ファイル名

stdoutは、コマンドの実行結果の出力先です。 標準出力(/dev/stdout)のファイルディスクリプターはfd = 1に割り当てられているため、1>でリダイレクトできます。

標準エラー出力したい(2>)

$ コマンド 2> ファイル名
$ コマンド 2>> ファイル名

stderrは、コマンドの進捗状況や実行結果のエラーなどの出力先です。 標準エラー出力(/dev/stderr)のファイルディスクリプターはfd = 2に割り当てられているため、2>でリダイレクトできます。

標準出力と標準エラー出力を保存したい(&>)

$ コマンド &> ファイル名
$ コマンド &>> ファイル名

&>で、stdoutとstderrをまとめて同じファイルにリダイレクトできます。

$ コマンド 1> ファイル名 2>&1
$ コマンド 1>> ファイル名 2>&1

2>&1で、stderrの出力先をstdoutと同じにできます。 &1の&は「これはファイル名ではなく、fd番号である」という目印です。 そのため、fd=2の出力先を、fd=1の出力先と同じにする、という意味になります。

注意

記述する順番はとても重要です。 必ず先に1>でファイルへのリダイレクトを済ませてから、2>&1を書く必要があります。

// 正しい: fd1の出力先を作ってから、fd2の出力先をfd1に設定している
$ コマンド 1> ファイル名 2>&1

// 誤り: fd1の出力先を作る前に、fd2の出力先をfd1に設定している
$ コマンド 2>&1 1> ファイル名

出力を破棄したい(/dev/null)

// 標準出力を破棄する
$ コマンド > /dev/null
$ コマンド 1> /dev/null

// 標準エラー出力を破棄する
$ コマンド 2> /dev/null

// 標準出力と標準エラー出力を破棄する
$ コマンド &> /dev/null

/dev/nullは、出力を破棄する特殊なファイルです。 いわばゴミ箱です。 リダイレクト先に/dev/nullを指定すると、出力を破棄できます。