UNIX入門:5. 入出力とそのリダイレクト(I/0&I/ORedirection)
5.1. 「リダイレクト」とは?
UNIX では,入出力 (Input/Output, I/O) がすべてファイル間で行われているということでした (第2項参照)。上記で列挙したコマンドも,入力ファイルや出力ファイルを指定しなければ,すべて,標準入出力,すなわち,ターミナルからの入出力となります。UNIX では,入力ファイルや出力ファイルを標準以外に切り替える (redirect) ことができ,これを「入出力のリダイレクト」(I/0 Redirection) といいます。
5.2. 入出力ファイルのリダイレクト
出力ファイルのリダイレクト (上書き):>
出力ファイルのリダイレクト (加える):>>
入力ファイルのリダイレクト (ファイル全体):<
入力ファイルのリダイレクト (ストップ・ワードまで標準入力:「ヒア・ドキュメント」):<<
- 例5.2.1:出力のリダイレクト (
>
)新しいファイル「
message.txt
」に "Hello Hanako!
" と書き入れる。(message.txt
は,出力のリダイレクト>
の使用で自動で作成される。)% cd # ホームへ % mkdir Mail # 新しいディレクトリ「Mail」を作成 % cd Mail # そこへ移動 % echo "Hello Hanako!" > message.txt % cat message.txt # message.txt の中身を見る Hello Hanako! %
- 例5.2.2:出力のリダイレクト (
>>
)それに "
How are you?
" と書き加える。% echo "How are you?" >> message.txt % cat message.txt Hello Hanako! How are you? %
- 例5.2.3:入出力のリダイレクト(
<<, >>
)さらに文章を書き加える。(下記の場合,ストップワードは「
EOF
」。これが入力されるまで,cat
の入力へリダイレクトされる。)% cat << EOF >> message.txt -> I'm working on Unix. -> I'm gonna move on to B-Shell Programming. -> Here's mannual of sh. -> EOF % cat message.txt Hello Hanako! How are you? I'm working on Unix. I'm gonna move on to B-Shell Programming. Here's mannual of sh. %
- 例5.2.4:出力のリダイレクト (
>
)コマンド
sh
のマニュアルをファイル「man_sh.txt
」へ書き込む。% man sh > man_sh.txt man: Formatting manual page... %
- 例5.2.5:出力のリダイレクト (
>>
)それをファイル「
message.txt
」に書き加える。% cat man_sh.txt >> message.txt
- 例5.2.6:入力のリダイレクト (
<
)hanako
にタイトル "man sh
" でファイル「message.txt
」の中身すべてをメイル% mail -s 'man sh' hanako < message.txt
- 例5.2.7:入出力のリダイレクト (
<, >
)ファイル「
man_sh.txt
」内の文字「redirection
」すべてを文字「REDIRECTION
」に変換し,それをファイル「man_sh_REDIRECT.txt
」へ出力。% sed 's/redirection/REDIRECTION/g' < man_sh.txt > man_sh_REDIRECT.txt
5.3. パイプ (Pipes)
Thompson と Ritchie が UNIX を開発した直後から,コマンドの出力を他のコマンドに渡すことを考え,数年後に実現することになります。コマンド command1
の出力をコマンド command2
の入力へ切り替えることを「パイプで繋ぐ」(piping) といいます。UNIX の特徴的な操作ともいえるでしょう。
% command1 | command2
パイピングは何回でも可能。
% command1 | command2 | command3 | command4
また,I/O リダイレクトとパイピングを併用することも可能。
% command1 | command2 > file
- 例5.3.1
コマンド
ls -l
は,多数のファイルがある場合,ターミナルの一画面に収まりません。そこで,その出力をコマンドmore
の入力に切り替え,ファイルリストの一つ目から確認できるようにしてみます。% ls -l | more
- 例5.3.2
ログインしている人数 (ログインしている人数が少なければ,数えた方が速いが...)
% who | wc -l
- 例5.3.3
コマンド
sh
のマニュアルの中で「redirection
」または「Redirection
」と書いてある部分の前後5行を抜き出してみます。% man sh | grep -5 -e "redirection" -e "Redirection"
5.4. 標準エラー出力とそのリダイレクト
■標準エラー出力 (Standard Error Output)
コマンドは,その処理にエラーがあれば,エラー・メッセージを出力します。
% cd ~/Mail % ls man_sh.txt man_sh_REDIRECT.txt message.txt % cat xxx > temp.txt cat: xxx: No such file or directory %
この場合,ファイル xxx
が存在しないため,コマンド cat xxx
に対し "cat: xxx: No such file or directory
" というエラーが出力された訳です。
ここで注意したいのは,上記の例から分かるように,出力のリダイレクト (>
) を使っても,エラーメッセージ "cat: xxx: No such file or directory
" は,ファイル temp.txt
へ出力されず,そのまま標準出力(ターミナル)へ出力されていることです。すなわち,エラーは標準出力として出力されるのであり,更に,それは,パイピングを含め I/O Redirection の対象とはなっていないのです。このように,エラー出力は,通常の出力とは区別され,別途の出力対象として標準出力となっており,これを「標準エラー出力」(Standard Error Output) といいます。
それでも,標準エラー出力をファイルへ出力したい場合があるかもしれません。その方法が「標準エラー出力のリダイレクト」です。
■標準エラー出力のリダイレクト
% command >& file
- 例5.4.1:エラーを「ゴミ箱」に出力
% cat xxx >& /dev/null % 注) Macintosh や Windows と異なり,/dev/null へ出力されたものは, 消えて無くなります。「ゴミ箱」を空にする必要はありません。