0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

シェルスクリプト: ファイル記述子とリダイレクトの仕組み

Last updated at Posted at 2025-12-10

はじめに

シェルスクリプトを扱う上で、ファイル記述子(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

解説:

  1. > /dev/null: 標準出力(1)の先を /dev/null に変更
  2. 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 に追記されます。


次回

次回は 「パラメータ展開と文字列操作」 について解説します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?