ファイルID | 意味 |
---|---|
0 | 標準入力(stdin)。キーボード |
1 | 標準出力(stdout)。ディスプレイ |
2 | 診断(エラー)出力(stderr)。ディスプレイ |
通常これらは端末を割り当てているため端末(キーボード)から入力し、
端末(CRT)に出力を行い、エラー・メッセージも端末に出力します。
シェルは、これら3つの入出力をファイルに切り換える事でき、
入出力リダイレクション(redirection) と言います。
$ ls -l > test.out $ cat test.out ディスク上の専有領域の合計 21119 (KBytes) -rw-r--r-- 1 yakoshi os2 18699 09月22日 11:15 00-index.txt -rw-r--r-- 1 yakoshi os2 21520278 09月22日 15:59 Tcl_book.ps -rw-r----- 1 yakoshi os2 1426 11月25日 09:49 a drwxr-x--- 13 yakoshi os2 512 08月04日 1992 cap60 -rw-r--r-- 1 yakoshi os2 53457 09月22日 10:56 gx drwxr-xr-x 3 yakoshi os2 512 09月22日 14:38 lib drwxr-xr-x 2 yakoshi os2 1024 09月22日 14:38 man -rw-r--r-- 1 yakoshi os2 39 09月17日 11:54 msg drwxr-x--- 7 yakoshi os2 512 12月02日 17:25 pbmplus10dec91 -rw-r----- 1 yakoshi os2 0 12月02日 18:25 test.outとなります。
# 追加書込の例 $ ls -l >> test.out
エラーメッセージは stdout へ、それ以外は stdout に表示される。 $ ls /etc/hosts /datarame ls: /detarame: そのようなファイルやディレクトリはありません /etc/hosts
普通の出力リダイレクションは stdout のみ切替える。 ( stderr が残ってしまう ) $ ls /etc/hosts /detarame > /dev/null ls: /detarame: そのようなファイルやディレクトリはありません
エラーメッセージ(stderr=2)をリダイレクションするにはファイルIDを指定。 ( この場合は標準出力が残ってしまう ) $ ls /etc/hosts /detarame 2> /dev/null /etc/hosts両方をまとめる場合には「大なり」(>)にアンド(&)を続けて指定します。
まずどの出力をリダイレクションするかを指定し、 続けてどのようにまとめる(合流させるか)を指定する。 $ ls /etc/hosts /detarame > /dev/null 2>&1 上記の場合、stderr(2)をstdout(1)へ連結している。 よって、2と1の表示順によって動作が変わることに注意。 $ ls /etc/hosts /detarame > /dev/null 1>&2 ls: /detarame: そのようなファイルやディレクトリはありません /etc/hosts
$ wc < test.out 22 166 1368さらに、ファイルではなくキーボードからの入力を書き溜めておき、 一気にコマンドに入力する方法もあります。
$ wc << EOD > Hello, world. > Here document sample > EOD 2 5 36これはヒアドキュメントとよばれ、2重の小なり( << )と、 それに続けてデータの終わりを表すキーワードを記述します。
$ date > a $ date >> a $ set -o noclobber $ date > a # 上書きはできない -bash: a: cannot overrite existing file $ date >> a # 追加は可能