リダイレクトしたい(>)
// 標準出力をファイルに保存
$ コマンド 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を指定すると、出力を破棄できます。