シェルの入出力リダイレクト


ほとんどの UNIX システム コマンドは、端末からの入力を受け入れ、結果の出力を端末に送り返します。コマンドは通常、標準入力と呼ばれる場所 (デフォルトでは端末) から入力を読み取ります。同様に、コマンドは通常、その出力を標準出力に書き込みます。標準出力はデフォルトでは端末でもあります。

リダイレクトコマンドのリストは次のとおりです:

コマンド 説明
コマンド > ファイル 出力をファイルにリダイレクトします。
コマンド < ファイル 入力をファイルにリダイレクトします。
コマンド>>ファイル 出力を追加してファイルにリダイレクトします。
n > ファイル ファイル記述子 n を持つファイルを file にリダイレクトします。
n >> ファイル ファイル記述子 n を含むファイルをファイルに追加してリダイレクトします。
ン>&m 出力ファイル m と n をマージします。
n<&m 入力ファイル m と n をマージします。
<<タグ 開始タグと終了タグの間のコンテンツを入力として取得します。

通常、ファイル記述子 0 は標準入力 (STDIN)、1 は標準出力 (STDOUT)、2 は標準エラー出力 (STDERR) であることに注意してください。


出力リダイレクト

リダイレクトは通常、コマンド間に特定のシンボルを挿入することによって実現されます。特に、これらのシンボルの構文は次のとおりです。

command1 > file1

上記のコマンドは command1 を実行し、出力内容を file1 に保存します。

file1 内の既存のコンテンツは新しいコンテンツに置き換えられることに注意してください。ファイルの最後に新しいコンテンツを追加する場合は、>> 演算子を使用します。

次の who コマンドを実行すると、コマンドの完全な出力がユーザー ファイル (users) にリダイレクトされます。

$ who > users

実行後、ターミナルに情報が出力されないためです。デフォルトから変更 標準出力デバイス(端末)を指定したファイルにリダイレクトします。

cat コマンドを使用してファイルの内容を表示できます:

$ cat users
_mbsetupuser console  Oct 31 17:35 
tianqixin    console  Oct 31 17:35 
tianqixin    ttys000  Dec  1 11:33

出力リダイレクトによりファイルの内容が上書きされます。以下の例を参照してください:

$ echo "php中文网:www.php.cn" > users
$ cat users
php中文网:www.php.cn
$

ファイルの内容を上書きしたくない場合は、> を使用できます。 ;> をファイルの末尾に追加します。例:

$ echo "php中文网:www.php.cn" >> users
$ cat users
php中文网:www.php.cn
php中文网:www.php.cn
$

入力リダイレクト

出力リダイレクトと同様に、Unix コマンドはファイルから入力を取得することもできます:

command1 < file1

このように、コマンドは元々キーボードから入力を取得する必要がある場合は、内容を読み取るためにファイルに転送されます。

注: 出力リダイレクトは符号 (>) より大きく、入力リダイレクトは符号 (<) より小さくなります。

上記の例に従って、users ファイル内の行数をカウントし、次のコマンドを実行する必要があります:

$ wc -l users
       2 users

入力を users ファイルにリダイレクトすることもできます:

$  wc -l < users
       2

注: 次のコマンドの結果上の 2 つの例は異なります。 まず、最初の例はファイル名を出力しますが、2 番目の例は標準入力からの読み取りのみを認識しているため、ファイル名を出力しません。

command1 < infile > outfile

入力と出力を同時に置き換え、command1を実行し、ファイルinfileから内容を読み取り、出力をoutfileに書き込みます。

リダイレクトの詳細な説明

通常、Unix/Linux の各コマンドを実行すると、次の 3 つのファイルが開きます:

  • 標準入力ファイル (stdin): stdin のファイル記述子は 0 で、Unix プログラムはデフォルトで stdin からデータを読み取ります。

  • 標準出力ファイル (stdout): stdout のファイル記述子は 1 です。Unix プログラムは、デフォルトでデータを stdout に出力します。

  • 標準エラー ファイル (stderr): stderr のファイル記述子は 2 で、Unix プログラムはエラー情報を stderr ストリームに書き込みます。

デフォルトでは、コマンド > ファイルは stdout をファイルにリダイレクトし、コマンド < ファイルは stdin をファイルにリダイレクトします。

stderr をファイルにリダイレクトしたい場合は、次のように書くことができます:

$ command 2 > file

stderr をファイルの末尾に追加したい場合は、次のように書くことができます:

$ command 2 >> file

2 は標準エラーを表しますファイル (stderr)。

stdout と stderr をマージしてファイルにリダイレクトしたい場合は、次のように書くことができます:

$ command > file 2>&1

或者

$ command >> file 2>&1

stdin と stdout の両方をリダイレクトしたい場合は、次のように書くことができます:

$ command < file1 >file2

command command redirects stdin to file1および stdout file2 にリダイレクトします。


ヒアドキュメント

ヒアドキュメントはシェルの特別なリダイレクトメソッドであり、入力を対話型のシェルスクリプトまたはプログラムにリダイレクトするために使用されます。

その基本的な形式は次のとおりです:

command << delimiter
    document
delimiter

その機能は、2 つの区切り文字の間にあるコンテンツ (ドキュメント) をコマンドへの入力として渡すことです。

注意:

  • 最後の区切り文字は先頭形式で記述する必要があります。スペースやタブ インデントを含む文字を前や後ろに置くことはできません。

  • 最初の区切り文字の前後のスペースは無視されます。

コマンドラインでwc -lコマンドを使用してヒアドキュメントの行数を計算します:

$ wc -l << EOF
    欢迎来到
    php中文网
    www.php.cn
EOF
3          # 输出结果为 3 行
$

スクリプト内でヒアドキュメントを使用することもできます。例えば:

#!/bin/bash
# author:php中文网
# url:www.php.cn

cat << EOF
欢迎来到
php中文网
www.php.cn
EOF

上記のスクリプトを実行して出力します。結果:

欢迎来到
php中文网
www.php.cn

/dev/null ファイル

コマンドを実行したいが、出力を画面に表示したくない場合は、出力を /dev/null にリダイレクトできます:

$ command > /dev/null

/ dev/null は、ファイルから読み取ろうとした場合、書き込まれた内容はすべて破棄される特殊なファイルです。ただし、/dev/null ファイルは非常に便利で、コマンドの出力をこのファイルにリダイレクトすると、「出力が無効になる」という効果があります。

stdout と stderr をブロックしたい場合は、次のように記述できます:

$ command > /dev/null 2>&1

注: 0 は標準入力 (STDIN)、1 は標準出力 (STDOUT)、2 は標準エラー出力です(標準エラー)。