リダイレクト
| 対応: | > >> 2> < /dev/null | POSIX(sh互換) |
|---|---|---|
| &> (stdout+stderr 同時リダイレクト) | Bash(bash拡張) |
『シェルスクリプト』では、コマンドの出力先や入力元をファイルや別のストリームへ切り替えることを「リダイレクト」と呼びます。標準出力(stdout)・標準エラー出力(stderr)・標準入力(stdin)の3つのストリームをリダイレクト演算子で制御することで、ログの保存・エラーの分離・不要な出力の破棄などを柔軟に行えます。
標準出力のリダイレクト(> / >>)
> はコマンドの標準出力をファイルに書き出します。ファイルが存在する場合は上書きされます。>> は既存ファイルの末尾に追記します。ファイルが存在しない場合はどちらも新規作成します。
| 書き方 | 説明 |
|---|---|
command > file | コマンドの標準出力を file に書き出します。ファイルが存在する場合は上書きします。 |
command >> file | コマンドの標準出力を file の末尾に追記します。ファイルが存在しない場合は新規作成します。 |
command 1> file | command > file と同じです。1 はファイルディスクリプタ番号で、標準出力を明示的に指定します。 |
command 1>> file | command >> file と同じです。標準出力を明示的に指定して追記します。 |
> file | コマンドなしで書くとファイルの内容を空にします(ファイルが存在しない場合は新規作成します)。 |
標準エラー出力のリダイレクト(2>)
ファイルディスクリプタ番号 2 が標準エラー出力を表します。2> を使うと標準出力とは別のファイルにエラーメッセージだけを保存できます。
| 書き方 | 説明 |
|---|---|
command 2> file | コマンドの標準エラー出力を file に書き出します。標準出力はそのままターミナルに表示されます。 |
command 2>> file | コマンドの標準エラー出力を file の末尾に追記します。 |
command 2> /dev/null | エラー出力を破棄します。エラーメッセージを表示させたくない場合に使います。 |
標準出力と標準エラーをまとめてリダイレクト(&>)
&> を使うと標準出力と標準エラー出力を同じファイルに一括でリダイレクトできます。bash 固有の構文で、sh では動作しません。POSIX 互換が必要な場合は 2>&1 を使います。
| 書き方 | 説明 |
|---|---|
command &> file | 標準出力と標準エラー出力をまとめて file に書き出します(bash 固有)。 |
command &>> file | 標準出力と標準エラー出力をまとめて file に追記します(bash 固有)。 |
command > file 2>&1 | 標準出力を file にリダイレクトしたあと、標準エラー出力を標準出力(file)に結合します。POSIX 互換の書き方です。 |
command >> file 2>&1 | 標準出力と標準エラー出力をまとめて file に追記します。POSIX 互換の書き方です。 |
/dev/null への破棄
/dev/null は書き込んだデータをすべて破棄する特殊なデバイスファイルです。不要な出力を完全に捨てたいときに使います。
| 書き方 | 説明 |
|---|---|
command > /dev/null | 標準出力を破棄します。コマンドの実行結果を表示させたくない場合に使います。 |
command 2> /dev/null | 標準エラー出力を破棄します。エラーメッセージを非表示にしたい場合に使います。 |
command > /dev/null 2>&1 | 標準出力と標準エラー出力をまとめて破棄します。コマンドの出力を一切表示させたくない場合に使います。 |
command &> /dev/null | 上と同じです。bash 固有の短縮記法です。 |
標準入力のリダイレクト(<)
< を使うとファイルの内容を標準入力として読み込めます。キーボード入力の代わりにファイルをコマンドに渡したいときに使います。
| 書き方 | 説明 |
|---|---|
command < file | file の内容を標準入力として command に渡します。 |
command < file > out.txt | 標準入力と標準出力を同時にリダイレクトします。 |
ファイルディスクリプタ番号の一覧
| 番号 | 名称 | デフォルトの接続先 |
|---|---|---|
0 | 標準入力(stdin) | キーボードです。 |
1 | 標準出力(stdout) | ターミナルの画面です。 |
2 | 標準エラー出力(stderr) | ターミナルの画面です(stdout とは独立したストリームです)。 |
サンプルコード
psycho_pass_redirect.sh
#!/bin/bash
# -----------------------------------------------
# PSYCHO-PASS のキャラクターを使ってリダイレクトの
# 基本動作を確認するスクリプトです
# -----------------------------------------------
# -----------------------------------------------
# 1. 標準出力を新規ファイルに書き出します(上書き)
# -----------------------------------------------
# 常守朱の情報をファイルに書き出します
echo "常守朱 / インスペクター / 犯罪係数: 計測不能" > akane.txt
echo "[1] akane.txt の内容:"
cat akane.txt
# → 常守朱 / インスペクター / 犯罪係数: 計測不能
echo ""
# -----------------------------------------------
# 2. 標準出力を既存ファイルに追記します(>>)
# -----------------------------------------------
# 狡噛慎也の情報を akane.txt に追記します
echo "狡噛慎也 / エンフォーサー / 犯罪係数: 280" >> akane.txt
echo "[2] 追記後の akane.txt:"
cat akane.txt
# → 常守朱 / インスペクター / 犯罪係数: 計測不能
# → 狡噛慎也 / エンフォーサー / 犯罪係数: 280
echo ""
# -----------------------------------------------
# 3. 標準エラー出力をファイルに書き出します(2>)
# -----------------------------------------------
# 存在しないファイルを cat しようとしてエラーを発生させます
# エラーメッセージだけ error.log に記録し、標準出力は画面に表示します
cat not_found.txt > stdout.txt 2> error.log
echo "[3] error.log の内容:"
cat error.log
# → cat: not_found.txt: No such file or directory
echo ""
# -----------------------------------------------
# 4. 標準出力と標準エラーをまとめてリダイレクトします
# -----------------------------------------------
# echo(成功)と cat(エラー)を同じファイルにまとめて記録します
{
echo "宜野座伸元 / エンフォーサー / 担当: 一係"
cat nonexistent_target.txt
} > combined.log 2>&1
echo "[4] combined.log の内容:"
cat combined.log
# → 宜野座伸元 / エンフォーサー / 担当: 一係
# → cat: nonexistent_target.txt: No such file or directory
echo ""
# -----------------------------------------------
# 5. 出力を /dev/null に破棄します
# -----------------------------------------------
# 成功メッセージのみ表示し、エラーは完全に破棄します
echo "槙島聖護 / ターゲット / 検索中..." 2>/dev/null
cat nonexistent_sibyl.txt 2>/dev/null # エラーは表示されません
echo "[5] エラーは表示されません(/dev/null に破棄済み)"
echo ""
# -----------------------------------------------
# 6. 標準入力をファイルから受け取ります(<)
# -----------------------------------------------
# akane.txt の内容を wc コマンドに標準入力として渡します
line_count=$(wc -l < akane.txt)
echo "[6] akane.txt の行数: ${line_count}"
# → 2
echo ""
# -----------------------------------------------
# 7. 後片付け: 生成したファイルを削除します
# -----------------------------------------------
rm -f akane.txt stdout.txt error.log combined.log
echo "[7] 作業ファイルを削除しました。"
$ chmod +x psycho_pass_redirect.sh $ ./psycho_pass_redirect.sh [1] akane.txt の内容: 常守朱 / インスペクター / 犯罪係数: 計測不能 [2] 追記後の akane.txt: 常守朱 / インスペクター / 犯罪係数: 計測不能 狡噛慎也 / エンフォーサー / 犯罪係数: 280 [3] error.log の内容: cat: not_found.txt: No such file or directory [4] combined.log の内容: 宜野座伸元 / エンフォーサー / 担当: 一係 cat: nonexistent_target.txt: No such file or directory [5] エラーは表示されません(/dev/null に破棄済み) [6] akane.txt の行数: 2 [7] 作業ファイルを削除しました。
psycho_pass_logger.sh(ログ出力の実用例)
#!/bin/bash
# -----------------------------------------------
# 犯罪係数チェック結果を stdout と stderr に分けて
# それぞれ別ファイルに記録するスクリプトです
# -----------------------------------------------
LOG_FILE="hue_log.txt"
ERROR_FILE="hue_error.txt"
# ログファイルを初期化します(> で空にします)
> "${LOG_FILE}"
> "${ERROR_FILE}"
# チェック対象のキャラクターと係数を定義します
# 書式: "名前:犯罪係数"
targets=(
"常守朱:計測不能"
"狡噛慎也:280"
"宜野座伸元:195"
"雛河翔:150"
"霜月美佳:45"
)
echo "=== 犯罪係数チェック開始 ===" | tee -a "${LOG_FILE}"
for entry in "${targets[@]}"; do
# コロンで名前と係数を分割します
name="${entry%%:*}"
coefficient="${entry##*:}"
# 係数が数値かどうか確認します(計測不能は数値変換できません)
if [[ "${coefficient}" =~ ^[0-9]+$ ]]; then
if [ "${coefficient}" -ge 200 ]; then
# 係数 200 以上はエラーログに記録します
echo "[WARN] ${name}: 係数 ${coefficient} — 執行対象の可能性があります。" \
2>> "${ERROR_FILE}" | tee -a "${LOG_FILE}"
# tee では stdout に出力しつつ LOG_FILE にも追記します
echo "[WARN] ${name}: 係数 ${coefficient} — 執行対象の可能性があります。" \
>> "${LOG_FILE}"
else
# 係数が低い場合は通常ログに記録します
echo "[OK] ${name}: 係数 ${coefficient} — 正常範囲内です。" \
>> "${LOG_FILE}"
fi
else
# 数値変換できない場合はエラーファイルに記録します
echo "[ERROR] ${name}: 係数「${coefficient}」は数値ではありません。" \
>> "${ERROR_FILE}"
fi
done
echo "=== チェック完了 ===" >> "${LOG_FILE}"
echo ""
echo "--- hue_log.txt ---"
cat "${LOG_FILE}"
echo ""
echo "--- hue_error.txt ---"
cat "${ERROR_FILE}"
# 後片付けします
rm -f "${LOG_FILE}" "${ERROR_FILE}"
$ chmod +x psycho_pass_logger.sh $ ./psycho_pass_logger.sh --- hue_log.txt --- === 犯罪係数チェック開始 === [WARN] 狡噛慎也: 係数 280 — 執行対象の可能性があります。 [WARN] 宜野座伸元: 係数 195 — 執行対象の可能性があります。 [OK] 雛河翔: 係数 150 — 正常範囲内です。 [OK] 霜月美佳: 係数 45 — 正常範囲内です。 === チェック完了 === --- hue_error.txt --- [ERROR] 常守朱: 係数「計測不能」は数値ではありません。
> と >> と 2>&1 の使い分け
| 目的 | 書き方 | 補足 |
|---|---|---|
| ログをファイルに保存したい(毎回上書き) | command > log.txt | 前回のログは消えます。 |
| ログを累積して残したい | command >> log.txt | cronジョブのログ記録に適しています。 |
| エラーだけ別ファイルに分けたい | command > out.txt 2> err.txt | stdout と stderr を別々に管理できます。 |
| stdout と stderr を同じファイルに残したい | command > all.log 2>&1 | 順序が重要です。2>&1 > all.log は誤りです。 |
| エラーを完全に無視したい | command 2> /dev/null | 正常出力は引き続き表示されます。 |
| 出力を完全に沈黙させたい | command > /dev/null 2>&1 | バックグラウンドジョブや cron で不要な出力を抑制するときに使います。 |
概要
『シェルスクリプト』のリダイレクトは、標準出力(ファイルディスクリプタ 1)・標準エラー出力(ファイルディスクリプタ 2)・標準入力(ファイルディスクリプタ 0)の向き先をファイルや別ストリームに切り替える機能です。> は上書き、>> は追記、2> はエラーのみ書き出し、&>(または > file 2>&1)はまとめてリダイレクトします。/dev/null に向けると出力を完全に破棄できます。> file 2>&1 と書くときは必ず > file を先に書く点に注意してください。逆順(2>&1 > file)では stderr がターミナルに残ります。ログを定期実行するスクリプトでは 特殊変数 の $? と組み合わせてエラーコードも記録すると便利です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。