はじめに
シェルスクリプトを扱う上で、ファイル記述子(File Descriptor: FD) と リダイレクト は、大事な要素の一つです。
これらを適切に使いこなすことで、ログの管理やコマンド間のデータの受け渡しを柔軟に行うことができます。
本記事では、標準入力(0)、標準出力(1)、標準エラー出力(2)といった基本的な操作から、実務でよく使われるリダイレクトのパターンについて解説します。
1. 基本的なリダイレクトとファイル記述子
Linux/Unixシステムでは、以下の3つのファイル記述子が標準で用意されています。
- 0: 標準入力 (stdin)
- 1: 標準出力 (stdout)
- 2: 標準エラー出力 (stderr)
出力の破棄 > /dev/null 2>&1
スクリプト内でコマンドを実行する際、出力(エラー含む)を画面に表示したくない場合があります。
その際によく使われるのが、以下の構文です。
# 標準出力と標準エラー出力を両方とも /dev/null(ゴミ箱)に捨てる
command > /dev/null 2>&1
解説:
-
> /dev/null: 標準出力(1)の先を/dev/nullに変更 -
2>&1: 標準エラー出力(2)の先を、標準出力(1)と同じ場所(つまり/dev/null)に変更
ファイルへの追記 >>
ログファイルなどに追記したい場合は >> を使用します。
echo "Log entry" >> app.log
2. パイプと tee コマンド
パイプ | を使うと、コマンドの標準出力を次のコマンドの標準入力に渡すことができます。
画面に表示しつつ、ファイルにも保存 tee
パイプで繋ぐと出力が次のコマンドに渡ってしまうため、画面には表示されなくなります。
「画面でも確認したいし、ログファイルにも保存したい」という場合は、 tee コマンドが便利です。
# コマンドの実行結果を画面に表示しつつ、result.txt にも保存
ls -l | tee result.txt
# 追記モードの場合は -a オプション
echo "New entry" | tee -a result.txt
3. ヒアドキュメント << EOF
スクリプト内に複数行のテキストを埋め込みたい場合や、対話的なコマンドに自動で入力を与えたい場合は、「ヒアドキュメント」が使われます。
# cat コマンドに複数行のテキストを渡す
cat << EOF > config.txt
Host example.com
User admin
Port 22
EOF
EOF は終端文字列(End Marker)で、任意の文字列(END, LIMIT など)が使えますが、EOF がよく使われます。
4. ログ出力の恒久的なリダイレクト exec
スクリプト内の全ての出力をログファイルに保存したい場合、exec コマンドを使ってシェル自体のFD操作を行うと便利です。
#!/bin/bash
LOG_FILE="script.log"
# 標準出力(1)と標準エラー出力(2)をログファイルに向ける
exec 1>>"$LOG_FILE" 2>&1
echo "これはログファイルに書き込まれます"
echo "エラーもログファイルへ" >&2
この設定以降、全ての出力は自動的に script.log に追記されます。
次回
次回は 「パラメータ展開と文字列操作」 について解説します。