ファイルID | 意味 |
---|---|
0 | 標準入力(stdin)。キーボード |
1 | 標準出力(stdout)。ディスプレイ |
2 | 診断(エラー)出力(stderr)。ディスプレイ |
通常これらは端末を割り当てているため端末(キーボード)から入力し、
端末(ディスプレイ)に出力を行い、エラー・メッセージも端末に出力します。
シェルは、これら3つの入出力をファイルに切り換える事でき、
入出力リダイレクション(redirection) と言います。
[student@h006 dir1]$ ls -l > test.out [student@h006 dir1]$ cat test.out 合計 16 -rw-rw-r-- 1 student student 8 7月 22 10:13 a.dat -rw-r--r-- 1 student student 43 7月 22 10:09 name.data -rw-rw-r-- 1 student student 43 7月 22 10:09 name.list -rw-rw-r-- 1 student student 0 7月 22 12:56 test.out -rw-rw-r-- 1 student student 567 7月 22 10:09 versions.txtとなります。
# 追加書込の例 [student@h006 dir1] ls -l >> test.out
エラーメッセージは stdout へ、それ以外は stdout に表示される。 [student@h006 ~]$ ls /etc/hosts /datarame ls: /detarame: そのようなファイルやディレクトリはありません /etc/hosts
普通の出力リダイレクションは stdout のみ切替える。 ( stderr が残ってしまう ) [student@h006 ~]$ ls /etc/hosts /detarame > /dev/null ls: /detarame にアクセスできません: そのようなファイルやディレクトリはありません
エラーメッセージ(stderr=2)をリダイレクションするにはファイルIDを指定。 ( この場合は標準出力が残ってしまう ) [student@h006 ~]$ ls /etc/hosts /detarame 2> /dev/null /etc/hosts両方をまとめる場合には「大なり」(>)にアンド(&)を続けて指定します。
まずどの出力をリダイレクションするかを指定し、 続けてどのようにまとめる(合流させるか)を指定する。 [student@h006 ~]$ ls /etc/hosts /detarame > /dev/null 2>&1 上記の場合、stderr(2)をstdout(1)へ連結している。 よって、2と1の表示順によって動作が変わることに注意。 [student@h006 ~]$ ls /etc/hosts /detarame > /dev/null 1>&2 ls: /detarame: そのようなファイルやディレクトリはありません /etc/hosts
[student@h006 ~]$ wc < test.out 22 166 1368さらに、ファイルではなくキーボードからの入力を書き溜めておき、 一気にコマンドに入力する方法もあります。
[student@h006 ~]$ wc << EOD > Hello, world. > Here document sample > EOD 2 5 36これはヒアドキュメントとよばれ、2重の小なり( << )と、 それに続けてデータの終わりを表すキーワードを記述します。
[student@h006 ~]$ date > a [student@h006 ~]$ date >> a [student@h006 ~]$ set -o noclobber [student@h006 ~]$ date > a # 上書きはできない -bash: date.out: 存在するファイルを上書きできません [student@h006 ~]$ date >> a # 追加は可能