Bash Redirection ノート
暇なので bash
のリダイレクトを復習する。本稿では file descritor を FD と呼ぶ。
Redirection
- 入力元や出力先を「向き直す」という意味に捉える。
- 覚えにくい要素が複数あるのが困る。
- 基本的な指示方法:数字、不等号、アンドマークの順番が基本。
- 既定値の存在のうっかり:毎度 FD を明示すればいいが、それはダサい。
- コマンドとリダイレクト宣言を同一ラインに書いたときの処理順序
/dev/null
の説明が本節にはない。どこだろう?-
まず FD を閉じる方法を押さえる。
bash$ exec n>&- bash$ exec n<&-
- リダイレクトに用いられる特別なファイル名というのがある:
/dev/fd/
fd/dev/stdin
: FD 0 に相当。/dev/stdout
: FD 1 に相当。/dev/stderr
: FD 2 に相当。/dev/tcp/
host/port: 後述の<>
の例で扱う。/dev/udp/
host/port
Redirecting Input
読み込み FD の開き方とでも言えばいいのか。
bash$ some_command n< some_source
- 不等号の前に数字を宣言する。
- 省略すると標準入力 1 が指定されたものとみなされる。
- 結果、指定した FD とファイル(と今の段階ではしておく)が結び付けられる。
こういう使い方もある:
bash$ exec 3< some_file
bash$ some_command <& 3 # 後述
Redirecting Output
書き込み FD の開き方。
bash$ some_command n> some_destination
- 不等号の前に数字を宣言する。
- 省略すると標準出力 2 が指定されたものとみなされる。
- 結果、指定した FD とファイルが結び付けられる。
この機能で問題になりがちなのは、標準エラー出力の内容を(ファイルに)欲しいときだ。 次の書き方をする:
bash$ some_command 2> some_destination
bash$ some_command > stdout.txt 2> stderr.txt
- シェルオプション
noclobber
のセットの有無によって、ファイルに上書きできたりできなかったりすることは覚えておく。 -
明示的に既存ファイルの上書きを防ぐリダイレクトの記法は:
bash$ some_command >| some_destination
Appending Redirected Output
bash$ some_command n>> some_destination
基本。ここはいい。
Redirecting Standard Output and Standard Error
bash$ some_command &> some_destination # preferred; equivalent to `some_command > some_destination 2>& 1`.
bash$ some_command >& some_destination
記号の順序を記憶できなくて困っていたが、実はどちらも同じ意味だったようだ。
Appending Standard Output and Standard Error
bash$ some_command &>> some_destination # equivalent to `some_command >> some_destination 2>& 1`.
Here Documents
bash$ some_commands <<word
here-documents
delimiter
- この機能はリダイレクト機能の一種だ。
word
にはEOF
がよく採用される。 <<word
だけでなく<<-word
という指示もある。行頭タブ文字を無視するようになる。
Here Strings
bash$ some_command <<<word
- これもリダイレクトの一種。
-
文字列を標準入力化する機能がある。使用例を示したほうがわかりやすいか:
bash$ sed '/s/:/\n/g' <<<$PATH # or `echo -n ${PATH//:/\\n}` /bin /usr/local/bin ...
Duplicating File Descriptors
bash$ some_command n<&word # default: n=0 (stdin)
bash$ some_command n>&word # default: n=1 (stdout)
何が複製なのかよくわからない。例えば some_cmd > some_dest 2>&1
とすると、
some_cmd
の標準出力の内容と標準エラー出力の内容の両方が標準出力に流出する。
Moving File Descriptors
bash$ exec n<&digit-
bash$ exec n>&digit-
どちらも右辺の FD を左辺のそれに名前を変える。 何に使うのがいいのかわからない(少し調べたら、descriptor の復元に使えるらしいが)。
Opening File Descriptors for Reading and Writing
bash$ exec n<>word
ファイルを FD n
として定義して、以降の処理で読み書き両方に取り扱えるようにする。
bash$ exec 9<>/dev/tcp/www.example.com/80
bash$ echo -e "GET / HTTP/1.1\n..." >&9
bash$ cat <&9
あまりまとまらなかった。