Unix-io-redirections
Unix/Linux-シェル入出力リダイレクト
この章では、シェルの入出力リダイレクトについて詳しく説明します。 ほとんどのUnixシステムコマンドは、端末から入力を受け取り、結果の出力を端末に送り返します。 通常、コマンドは標準入力から入力を読み取ります。標準入力はデフォルトで端末です。 同様に、コマンドは通常、その出力を標準出力に書き込みます。これもデフォルトでターミナルです。
出力のリダイレクト
通常は標準出力向けのコマンドからの出力は、代わりにファイルに簡単に転送できます。 この機能は、出力リダイレクトと呼ばれます。
通常、出力を標準出力に書き込むコマンドに表記法> fileが追加されている場合、そのコマンドの出力は端末ではなくファイルに書き込まれます。
usersファイル内のコマンドの完全な出力をリダイレクトする次の who コマンドを確認してください。
$ who > users
ターミナルに出力が表示されないことに注意してください。 これは、出力がデフォルトの標準出力デバイス(ターミナル)から指定されたファイルにリダイレクトされたためです。 あなたは完全なコンテンツのユーザーファイルを確認することができます-
$ cat users
oko tty01 Sep 12 07:30
ai tty15 Sep 12 13:32
ruth tty21 Sep 12 10:10
pat tty24 Sep 12 13:07
steve tty25 Sep 12 13:03
$
コマンドの出力がファイルにリダイレクトされ、ファイルにすでにデータが含まれている場合、そのデータは失われます。 次の例を考慮してください-
$ echo line 1 > users
$ cat users
line 1
$
次のように>>演算子を使用して、既存のファイルに出力を追加できます-
$ echo line 2 >> users
$ cat users
line 1
line 2
$
入力リダイレクト
コマンドの出力をファイルにリダイレクトできるように、コマンドの入力もファイルからリダイレクトできます。 *より大きい文字> *は出力のリダイレクトに使用されるため、*より小さい文字<*はコマンドの入力をリダイレクトするために使用されます。
通常、標準入力から入力を受け取るコマンドは、この方法で入力をファイルからリダイレクトできます。 たとえば、上記で生成されたファイル_users_の行数をカウントするには、次のようにコマンドを実行できます-
$ wc -l users
2 users
$
実行すると、次の出力が表示されます。 ファイル_users_から wc コマンドの標準入力をリダイレクトすることにより、ファイルの行数をカウントできます-
$ wc -l < users
2
$
wcコマンドの2つの形式によって生成される出力には違いがあることに注意してください。 最初のケースでは、ファイルユーザーの名前が行数とともにリストされます。 2番目のケースでは、そうではありません。
前者の場合、wcはファイルユーザーから入力を読み取っていることを認識しています。 2番目のケースでは、ファイル名を表示しないため、標準入力から入力を読み取っていることがわかっているだけです。
ヒアドキュメント
- hereドキュメント*は、対話型のシェルスクリプトまたはプログラムに入力をリダイレクトするために使用されます。
対話型プログラムまたは対話型シェルスクリプトに必要な入力を提供することにより、ユーザーの操作なしでシェルスクリプト内で対話型プログラムを実行できます。
- ここ*ドキュメントの一般的な形式は-
command << delimiter
document
delimiter
ここで、シェルは << 演算子を、指定された区切り文字を含む行が見つかるまで入力を読み取る命令として解釈します。 区切り文字を含む行までのすべての入力行は、コマンドの標準入力に送られます。
区切り文字は、シェルに here ドキュメントが完了したことを伝えます。 これがないと、シェルは入力を永久に読み取り続けます。 区切り文字は、スペースまたはタブを含まない単一の単語でなければなりません。
以下は、行の総数を数えるコマンド wc -l への入力です-
$wc -l << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
3
$
次のようにスクリプトを使用して複数の行を印刷するには、* hereドキュメント*を使用できます-
#!/bin/sh
cat << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
実行すると、次の結果が表示されます-
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
次のスクリプトは、 vi テキストエディターでセッションを実行し、入力をファイル test.txt に保存します。
#!/bin/sh
filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands
vimとして機能するvimでこのスクリプトを実行すると、次のような出力が表示される可能性があります-
$ sh test.sh
Vim: Warning: Input is not from a terminal
$
スクリプトを実行した後、ファイル test.txt に次の内容が追加されます-
$ cat test.txt
This file was created automatically from
a shell script
$
出力を破棄する
コマンドを実行する必要がある場合もありますが、出力を画面に表示したくない場合があります。 このような場合、ファイル /dev/null にリダイレクトすることで出力を破棄できます-
$ command >/dev/null
ここで、commandは実行するコマンドの名前です。 ファイル /dev/null は、すべての入力を自動的に破棄する特別なファイルです。
コマンドの出力とそのエラー出力の両方を破棄するには、標準リダイレクトを使用して STDERR を STDOUT にリダイレクトします-
$ command >/dev/null 2>&1
ここで、 2 は STDERR を表し、 1 は STDOUT を表します。 次のようにSTDOUTをSTDERRにリダイレクトすることにより、STDERRにメッセージを表示できます-
$ echo message 1>&2
リダイレクトコマンド
以下は、リダイレクトに使用できるコマンドの完全なリストです-
Sr.No. | Command & Description |
---|---|
1 |
pgm > file pgmの出力はファイルにリダイレクトされます |
2 |
pgm < file プログラムpgmはファイルから入力を読み取ります |
3 |
pgm >> file pgmの出力はファイルに追加されます |
4 |
n > file ファイルにリダイレクトされた記述子 n を持つストリームからの出力 |
5 |
n >> file ファイルに記述子 n が追加されたストリームからの出力 |
6 |
n >& m ストリーム n からの出力をストリーム m にマージします |
7 |
n <& m ストリーム n からの入力をストリーム m にマージします |
8 |
<< tag 標準入力は、ここから行頭の次のタグを介して取得されます |
9 |
VERBAR あるプログラムまたはプロセスから出力を取得し、別のプログラムまたはプロセスに送信します |
ファイル記述子 0 は通常標準入力(STDIN)、 1 は標準出力(STDOUT)、および 2 は標準エラー出力(STDERR)であることに注意してください。