コンテンツにスキップ

リダイレクト (CLI)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
入力、出力、エラー出力のための標準ストリーム

コンピューティングにおいて、リダイレクト英語: Redirect)とはリダイレクションを行うこと。リダイレクションとは、様々なシェルを含むほとんどのコマンドラインインタプリタに共通の機能であり、標準ストリームをユーザで指定した位置に変更する機能のこと。

プログラムはdup2(2)システムコールまたはより柔軟でレベルの高い類似物であるfreopen(3)およびpopen(3)によってリダイレクトする。

標準入力と標準出力のリダイレクト

[編集]

リダイレクションは通常、コマンドの間である文字を置くことによって行われる。一般に、これらの文字のシンタックスは以下のとおりである:

command1 > file1

command1を実行し、結果をfile1に出力する。file1は上書きされるため、元の内容はすべて消去されることに注意すべきである。ただし、文字 >> を使用して、既存ファイルの末尾に出力を追加(アペンド)すれば、元の内容を温存することができる。

command1 < file1

キーボードの代わりに、入力のソースとしてfile1を使用し、command1を実行する。

command1 < infile > outfile

二つの機能を結合する。 command1infileを読み、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

と同じである。

ヒアドキュメントからのリダイレクト

[編集]

固定的な文字列を標準入力から読み込ませる方法には、前述の、echoを用いて標準入力から読み込ませる以外に、ヒアドキュメントからのリダイレクトを用いる方法がある。それには、以下のような方法を用いる。

command1 <<!
document
!

ここで、<<に後続する文字列は必ずしも"!"である必要はない。伝統的には"!"や"EOF"(複数文字であってもよい)などがよく用いられ、その文字がドキュメントの終端を示す。標準入力に読み込ませるドキュメントがまさにその場所にあることから、そのドキュメントをヒアドキュメントと呼んでいる。

これを用いると、echoを用いた前述の例

echo -e "user\npass" | ftp localhost

ftp localhost <<!
user
pass
!

に置き換え可能である。標準入力からの操作を待つ、インタラクティブなコマンドを用いて、非インタラクティブに処理を行う場合に多用される。

つながれたパイプライン

[編集]

リダイレクションとパイプトークンを、複雑なコマンドを作成するためにつなぐことができる。たとえば:

ls | grep '\.sh' | sort > shlist

これはカレントディレクトリの内容をリストし、.shを含む行のみをフィルタリングし、辞書順に並べ、shlistに出力する。このタイプの構造はシェルスクリプトバッチファイルの中で非常によく使用される。

多重出力へのリダイレクト

[編集]

標準コマンドteeは出力をコマンドからいくつかのあて先にリダイレクトすることができる。

ls -lrt | tee xyz

これはファイルリストの出力をファイルxyzと標準出力の両方に書き出す。