リダイレクト (CLI)
From Wikipedia, the free encyclopedia
リダイレクト(英語: Redirect)とは、プログラムが使用する標準的なデータの流れ(標準ストリーム)を別の入出力先に振り向ける操作である。コマンドラインインタプリタを通じて行われ、ファイル、デバイス、別のプログラムとの間でデータのやり取りを制御する基本的な方法として広く用いられる。
Unix系 オペレーティングシステムで発達し、POSIX 仕様に含まれるこの機能は、オペレーティングシステムのファイル記述子の再割当によって実現される。
リダイレクションは通常、コマンドの間である文字を置くことによって行われる。一般に、これらの文字のシンタックスは以下のとおりである:
command1 > file1
command1を実行し、結果をfile1に出力する。file1は上書きされるため、元の内容はすべて消去されることに注意すべきである。ただし、文字 >> を使用して、既存ファイルの末尾に出力を追加(アペンド)すれば、元の内容を温存することができる。
command1 < file1
キーボードの代わりに、入力のソースとしてfile1を使用し、command1を実行する。
command1 < infile > outfile
二つの機能を結合する。 command1はinfileを読み、outfileに書く。
パイプ処理
ひとつのプログラムが明示的な中間のファイルを必要とせずに別のプログラムの出力を読むように、プログラム動作させることができる。
command1 | command2
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出力をfile1にリダイレクトし、command1を実行する。
C Shellの系列にあるシェルの場合、シンタックスは代わりに文字&をリダイレクト文字に付加し、同様の結果を達成する。
別の有益な機能は、1つの標準ファイルハンドルを別のものにリダイレクトすることである。もっともポピュラーなバリエーションは、エラーメッセージを通常の出力と一緒に(または交互に)処理することができるように、標準出力の中に標準エラー出力を併合することである。
例:
find / -name .profile -print > results 2>&1
は.profileと名づけられたすべてのファイルを見つけようとする。リダイレクションなしで実行された場合、標準出力にヒットを出力し、エラー(例:保護されたディレクトリを横切る権限の不足など)を標準エラー出力に出力する。標準出力が結果をファイルresultsにリダイレクトするとき、エラーメッセージは通常通り画面に出力される。ファイルresultsで、ヒットとエラーメッセージの両方を見るために、2>&1を使用して、標準出力(ハンドル1)の中に標準エラー出力(ハンドル2)を合併する。
>の前に2>&1を置くことは可能だが、うまく働かない。事実、インタプリタが2>&1を読む時に、標準出力がどこでリダイレクトされるかを知らない。
もし併合された出力が別のプログラムにパイプで輸送される必要があるならば、ファイル併合シーケンス2>&1は以下のようにパイプ文字に先行しなければならない:
find / -name .profile -print 2>&1 | less
コマンドの簡素化したフォーム:
command > file 2>&1
は
command &>file
または
command >&file
と同じである。