試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

リダイレクトとパイプのパターン集(前半)

標準出力のデータをファイルから読み込む

patchコマンドなど、ファイルを標準入力として受け付けるものは

$ [コマンド...] < [ファイル]

のようにして実行するが、このようなパターンではなく、入力ファイルの場所を引数で指定する形のコマンドで標準入力から受け取りたい場合は、ファイル名部分に「-」という指定を行って標準入力を用いることを示す必要のある場合がある。
下は-iオプションでファイル名を指定するコマンドの場合。

$ [コマンド...] -i - < [ファイル]

実際にはこの形は実用的ではない(標準入力を用いずに-iオプションの値にファイルの場所をそのまま指定すればよい)が、後半で扱うパイプを用いたときに「-i -」のような記述が役に立つ場面が出る。

標準出力のデータをファイルに書き出す

以下の例では標準出力のデータをファイルとして書き出し、既に存在するファイルの場所が指定された場合は上書きされ、以前の内容は残らない。シェルの設定によっては、指定したファイルが存在する場合に上書きしない代わりにエラーを出すこともできる。

(既に存在する場合、シェルの設定によりエラーが出る)
$ [コマンド...] > [ファイル]
(既に存在する場合でも必ず上書き)
$ [コマンド...] >| [ファイル]

以下は既存のファイルがある場合に出力が末尾に書き込まれる形。こちらは、シェルの設定によってはファイルが存在しないときにエラーを出す。

(ファイルが存在しない場合、シェルの設定によりエラーが出る)
$ [コマンド...] >> [ファイル]
(ファイルが存在しない場合でも必ず書き出し)
$ [コマンド...] >>| [ファイル]

上記の合計4つのパターンにより標準出力のデータをファイルに出力するように指定した場合でも、標準エラー出力はファイルに書き出されずに端末に出力される。*1
「シェルの設定によっては」と途中で書いているが、以下の設定が該当する設定となり、これを記述するとエラーを出すようになる。これは対象のファイルの有無が問題になるときに便利。
(bash用)
ファイル名: ~/.bashrc

set -o noclobber

(zsh用)
ファイル名: ${ZDOTDIR}/.zshrc

setopt no_CLOBBER

なお、標準出力の書き出しでは標準出力のファイル記述子値(1)を用いて

$ [コマンド] 1> [ファイル]

という書き方もできるが、あまり使用されることはない。*2

(「リダイレクトとパイプのパターン集(後半)」に続く)

関連記事:

*1:エラー用の出力を標準と別に分けている大きな理由として「エラーがファイルに書き出されて気付けない」ということを防ぐためというのがある

*2:標準入力について、同様に「0< [ファイル]」として指定することもできるが、これもあまり使用されることはない