今回は、リダイレクションについて書こうと思います。 また、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
とシェルに入力します。
ファイルの上書きと付け足しについて
ファイルの上書きと付け足しの違いは以下の通りです。
- 上書き: 既に書かれている内容を消して、新しく書き換える
- 付け足し: 既に書かれている内容の下に、記述する内容を追加する
3以上のファイルディスクリプタ
結論から書きます。 ファイルディスクリプタn番を使ってファイル
file
に書き込む場合、 上書きなら
$ exec n> file
付け足しなら
$ exec n>> file
とシェルで実行します。 また、 file
をファイルディスクリプタn番を使って入力用にオープンする場合は、
$ exec n< file
とシェルに入力します。では、どういった場面で使うのかですが、
筆者は実用した覚えはないです...(ごめんなさい)
頻繁に使うものかは分かりません... ただ、理解しておいて損はないと思います。 システムコールopen
では、 オープンしたファイルのファイルディスクリプタを返しています。 他にも、 read
やwrite
の第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);
のように実現します。
とりあえず、ざっと書きたいことを書けたので満足です。 説明としては不十分だったりするかもしれませんが、 その場合は、心優しい方々が適切にご指摘していただけると嬉しく思います。
(言い訳: 自分自身、勉強中の身なので、知識が不十分ですので...)
参考文献
-
ブルース・ブリン 著・山下哲典 訳入門UNIXシェルプログラミングSB Creative
- C言語システムコール-open CapmNetwork