Section Next | Prev


3.3.1 入出力リディレクション機能

UNIX では、各プロセス(コマンド実行)に際して次の3つの入出力装置を 自動的に割り当てます。
ファイルID 意味
標準入力(stdin)。キーボード
標準出力(stdout)。ディスプレイ
診断(エラー)出力(stderr)。ディスプレイ

通常これらは端末を割り当てているため端末(キーボード)から入力し、 端末(CRT)に出力を行い、エラー・メッセージも端末に出力します。
シェルは、これら3つの入出力をファイルに切り換える事でき、 入出力リダイレクション(redirection) と言います。

出力のリダイレクション
次の様することで ls コマンドの出力を test.out ファイルへできます。
	$ 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
となります。
すでに存在しているファイルに付け加える時は2重の負等号「大なり」 ( >> )を使用します。
	# 追加書込の例
	$ ls -l >> test.out

標準出力とエラー出力の扱い
ファイルIDを明示して、エラー出力と標準出力を別々に扱うこともできます。
エラーメッセージは 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重の小なり( << )と、 それに続けてデータの終わりを表すキーワードを記述します。
開始するとシェルの継続行プロンプト(PS2で定めた値)が表示され、 終了キーワードを入力するまで継続されます。

補足事項
ファイルリダイレクションにより、ファイル上書きしないようシェルオプションを指定する事ができます。
	$ date > a
	$ date >> a

	$ set -o noclobber
	$ date > a 	# 上書きはできない
	-bash: a: cannot overrite existing file
	$ date >> a	# 追加は可能

Section Next | Prev

Copyright 2007-2018 ycosSystems Shell/Body331.html