へっぽこ社会人4年生がプログラミングを頑張る

へっぽこ社会人4年目がプログラミング系統を中心に書きたいことをつらつらと書きます

UNIX ファイルディスクリプタに触れてみる その2

UNIX ファイルディスクリプタに触れてみる その1では、 標準入力標準出力標準エラーについて書きました。
今回は、リダイレクションについて書こうと思います。 また、3以上のファイルディスクリプタについても軽く触れようと思います。
リダイレクトを用いたファイルの読み書き
コマンド cat にファイル file を入力する場合は
$ cat < file
とシェルに入力します。
コマンド ls の出力結果をファイル fileに出力する場合は、 ファイルが存在しなければ新規作成し、 存在すれば上書きまたは付け足しをします。 上書きと付け足しで記述が異なります。 ls の標準出力の内容を file に上書きする場合は
$ ls > file
とシェルに入力することで、 fileに標準出力の結果が記録されます。 付け足しの場合は、
$ ls >> file
とシェルに入力します。
ls の標準エラーの内容を file に上書きする場合、
$ ls 2> file
とシェルに入力し、 file に付け足す場合、
$ ls 2>> file
とシェルに入力します。
ls の標準出力と標準エラーの内容両方を file に記録したい場合は、
$ ls > file 2>&1
と入力することで、両方の内容を file に上書き出来ます。 付け足す場合は、
$ ls >> file 2>&1
とシェルに入力します。
2>&1 と記述することで、 ファイルディスクリプタ2番(標準エラー)を、 ファイルディスクリプタ1番(標準出力)と一緒にまとめます。
ファイルの上書きと付け足しについて

ファイルの上書きと付け足しの違いは以下の通りです。

  • 上書き: 既に書かれている内容を消して、新しく書き換える
  • 付け足し: 既に書かれている内容の下に、記述する内容を追加する
3以上のファイルディスクリプタ
結論から書きます。 ファイルディスクリプタn番を使ってファイル file に書き込む場合、 上書きなら
$ exec n> file
付け足しなら
$ exec n>> file
とシェルで実行します。 また、 file をファイルディスクリプタn番を使って入力用にオープンする場合は、
$ exec n< file
とシェルに入力します。
では、どういった場面で使うのかですが、
筆者は実用した覚えはないです...(ごめんなさい)
頻繁に使うものかは分かりません... ただ、理解しておいて損はないと思います。 システムコールopenでは、 オープンしたファイルのファイルディスクリプタを返しています。 他にも、 readwriteの第1引数には、 ファイルディスクリプタを渡します。 オープンしたファイルの読み書きをしたい場合、 オープンしたファイルのファイルディスクリプタを渡します。
$ exec n> file

openで記述すると

fd = open("file", O_WRONLY | O_CREAT | O_TRUNC, 0644);

のようになり、

$ exec n>> file

openで記述すると

fd = open("file", O_WRONLY | O_CREAT | O_APPEND, 0644);

のようになります。

また、

$ exec n< file

openで記述すると

fd = open("file", O_RDONLY);

のように実現します。

とりあえず、ざっと書きたいことを書けたので満足です。 説明としては不十分だったりするかもしれませんが、 その場合は、心優しい方々が適切にご指摘していただけると嬉しく思います。

(言い訳: 自分自身、勉強中の身なので、知識が不十分ですので...)
参考文献