(Translated by https://www.hiragana.jp/)
リダイレクト (CLI) - Wikipedia コンテンツにスキップ

リダイレクト (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と標準ひょうじゅん出力しゅつりょく両方りょうほうす。