リダイレクト()とは、プログラムが使用する標準的なデータの流れ(標準ストリーム)を別の入出力先に振り向ける操作である。コマンドラインインタプリタを通じて行われ、ファイル、デバイス、別のプログラムとの間でデータのやり取りを制御する基本的な方法として広く用いられる。
Unix系 オペレーティングシステムで発達し、POSIX 仕様に含まれるこの機能は、オペレーティングシステムのファイル記述子の再割当によって実現される。
標準入力と標準出力のリダイレクト リダイレクションは通常、コマンドの間である文字を置くことによって行われる。一般に、これらの文字のシンタックスは以下のとおりである:
command1 > file1
を実行し、結果をに出力する。は上書きされるため、元の内容はすべて消去されることに注意すべきである。ただし、文字を使用して、既存ファイルの末尾に出力を追加(アペンド)すれば、元の内容を温存することができる。
command1 < file1
キーボードの代わりに、入力のソースとしてを使用し、を実行する。
command1 < infile > outfile
二つの機能を結合する。 はを読み、に書く。
パイプ処理 ひとつのプログラムが明示的な中間のファイルを必要とせずに別のプログラムの出力を読むように、プログラム動作させることができる。
command1 | command2
を実行し、出力をの入力として使用する。文字"|"が「パイプ」と呼称されるので、これはパイプ処理と呼ばれる。
これは、二つのリダイレクトとテンポラリファイルを使用することと同等である(command1とcommand2が並行して処理されるか、rmが不可分操作であるか、といった違いはある)。
command1 > tempfile command2 < tempfile rm tempfile
パイプ処理のためのよい例は、インタラクティブでないシェルの中で何かインタラクティブなことを行うためにechoを別なコマンドと結合することである。たとえば
echo -e "user\npass" | ftp localhost
これはユーザ名、リターンキー、パスワードをあらかじめ入力してFile Transfer Protocolクライアントを走らせる。
標準のファイルハンドルへの/からのリダイレクト オリジナルのBourne Shellからの系統であるシェルにおいて、文字の直前にある数(ファイル記述子)を置くことによって最初の二回の行動はさらに修正される。これは、どのストリームがリダイレクションのために使用されるかに影響する。Unixの標準I/Oストリームは以下のとおりである:
ハンドル 名前 説明 0 stdin 標準入力 1 stdout 標準出力 2 stderr 標準エラー出力
例えば:
command1 2> file1
stderr出力をにリダイレクトし、を実行する。
C Shellの系列にあるシェルの場合、シンタックスは代わりに文字をリダイレクト文字に付加し、同様の結果を達成する。
別の有益な機能は、1つの標準ファイルハンドルを別のものにリダイレクトすることである。もっともポピュラーなバリエーションは、エラーメッセージを通常の出力と一緒に(または交互に)処理することができるように、標準出力の中に標準エラー出力を併合することである。
例:
find / -name .profile -print > results 2>&1
はと名づけられたすべてのファイルを見つけようとする。リダイレクションなしで実行された場合、標準出力にヒットを出力し、エラー(例:保護されたディレクトリを横切る権限の不足など)を標準エラー出力に出力する。標準出力が結果をファイルにリダイレクトするとき、エラーメッセージは通常通り画面に出力される。ファイルで、ヒットとエラーメッセージの両方を見るために、を使用して、標準出力(ハンドル1)の中に標準エラー出力(ハンドル2)を合併する。
の前にを置くことは可能だが、うまく働かない。事実、インタプリタがを読む時に、標準出力がどこでリダイレクトされるかを知らない。
もし併合された出力が別のプログラムにパイプで輸送される必要があるならば、ファイル併合シーケンスは以下のようにパイプ文字に先行しなければならない:
find / -name .profile -print 2>&1 | less
コマンドの簡素化したフォーム:
command > file 2>&1
は
command &>file
または
command >&file
と同じである。
ヒアドキュメントからのリダイレクト 固定的な文字列を標準入力から読み込ませる方法には、前述の、echoを用いて標準入力から読み込ませる以外に、ヒアドキュメントからのリダイレクトを用いる方法がある。それには、以下のような方法を用いる。
command1 <<! document !
ここで、<<に後続する文字列は必ずしも"!"である必要はない。伝統的には"!"や"EOF"(複数文字であってもよい)などがよく用いられ、その文字がドキュメントの終端を示す。標準入力に読み込ませるドキュメントがまさにその場所にあることから、そのドキュメントをヒアドキュメントと呼んでいる。
これを用いると、echoを用いた前述の例
echo -e "user\npass" | ftp localhost
は
ftp localhost <<! user pass !
に置き換え可能である。標準入力からの操作を待つ、インタラクティブなコマンドを用いて、非インタラクティブに処理を行う場合に多用される。
つながれたパイプライン リダイレクションとパイプトークンを、複雑なコマンドを作成するためにつなぐことができる。たとえば:
ls | grep '\.sh' | sort > shlist
これはカレントディレクトリの内容をリストし、を含む行のみをフィルタリングし、辞書順に並べ、に出力する。このタイプの構造はシェルスクリプトとバッチファイルの中で非常によく使用される。
多重出力へのリダイレクト 標準コマンドteeは出力をコマンドからいくつかのあて先にリダイレクトすることができる。
ls -lrt | tee xyz
これはファイルリストの出力をファイルxyzと標準出力の両方に書き出す。