bash プログラミング:パイプとリダイレクト
bash のリダイレクトには sh には存在しない幾つかの方法があります。今回はそれも踏まえてリダイレクトについて説明します。
標準入力、標準出力、標準エラー出力
- 標準入力
「/dev/stdin」 - 標準出力
「/dev/stdout」 - 標準エラー出力
「/dev/stderr」
これらのデバイスは次の様に使用します。
$ echo “エラーメッセージです。” > /dev/stderr |
これはエラーメッセージを標準エラー出力に出す方法です。
ただし出力する場合は問題無いのですが、これらは複製ですので「/dev/stdin」の利用はお勧め出来ません。
標準出力をパイプする
標準出力をパイプするには次の様にします。
$ echo ‘ABC’ | cat |
「| cat」 標準出力を cat コマンドにパイプ
標準エラー出力をパイプする
標準エラー出力をパイプするには次の様にします。
$ ( echo ‘ABC’ > /dev/stderr ; echo ‘DEF’) 2>&1 > /dev/null | cat ABC $ |
- 「2>&1」で標準エラー出力を標準出力に合流
- 「> /dev/null」元々の標準出力を破棄
- 「| cat」標準出力をパイプ
標準出力と標準エラー出力をパイプする
標準出力と標準エラー出力をパイプするには次の様にします。
$ ( echo ‘ABC’ > /dev/stderr ; echo ‘DEF’) |& cat ABC DEF $ |
「|& cat」 標準エラー出力を標準出力に合流させて cat コマンドにパイプ
標準入力からの読み込み
bash での標準入力からの読み込みでは「select」や「read」または「readline」を使います。
- read
標準入力からの読み込み。 - readline
readline ライブラリを利用した読み込み。
ヒストリー機能や入力補完などがある。
readline は便利ですが少しややこしいので、ここでは read を使用します。
read [-n 文字数] [ -p ‘プロンプト文字列’] 変数名 |
1文字を読み込む場合
$ read -n 1 -p ‘何かキーを押してください : ‘ VALUE; echo -e “\n読み込んだ文字 ${VALUE}” 何かキーを押してください : a 読み込んだ文字 a $ |
Linux / UNIX では標準入力はブロックデバイスと呼ばれ、Enter キーが押されるまでは入力出来ません。
しかし read コマンドでは一時的にバッファリングを行わない様にして入力を行いますので、問題ありません。
1行を読み込む場合
$ read -p ‘今の気分は? : ‘ VALUE; echo “読み込んだ文字 [${VALUE}]” 今の気分は? : good 読み込んだ文字 [good] $ |
文字を入力した後に Enter キーを押してしますが、改行コードは削除されています。
標準出力を標準エラー出力に割り当てる
$ echo ‘エラーメッセージ’ > /dev/stderr |
「> /dev/stderr」を使用する事で、標準出力が標準エラー出力に割り当てられます。
標準出力をファイルに複製する
$ echo ‘メッセージ’ | tee message.log |
tee コマンドを利用すると、標準入力から読み込んだ内容をファイルと標準出力に書き込みます。
使用法: tee [オプション]... [ファイル]...
標準入力を各 FILE にコピーし、標準出力にも出力します。
-a, --append 指定されたファイルに追加し、上書きしない
-i, --ignore-interrupts 割込みシグナルを無視
-p diagnose errors writing to non pipes
--output-error[=MODE] set behavior on write error. See MODE below
--help この使い方を表示して終了する
--version バージョン情報を表示して終了する
MODE determines behavior with write errors on the outputs:
'warn' diagnose errors writing to any output
'warn-nopipe' diagnose errors writing to any output not a pipe
'exit' exit on error writing to any output
'exit-nopipe' exit on error writing to any output not a pipe
The default MODE for the -p option is 'warn-nopipe'.
The default operation when --output-error is not specified, is to
exit immediately on error writing to a pipe, and diagnose errors
writing to non pipe outputs.
GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report any translation bugs to <https://translationproject.org/team/>
Full documentation <https://www.gnu.org/software/coreutils/tee>
or available locally via: info '(coreutils) tee invocation'
パイプについて
パイプはあくまでも標準出力を受け渡すものですので、通常は標準エラー出力は無視されます。
また、標準エラー出力をパイプしたりする方法では標準出力へと合流させているだけですので注意が必要です。