web-dev-qa-db-ja.com

`cat <> file`はどのように機能しますか?

cat < filefileの内容をstdoutに出力します。

cat > fileはstdinを Ctrl+D が検出され、入力テキストがfileに書き込まれます。

cat <> file、少なくとも私のバージョンのBashでは、fileの内容を(エラーなしで)幸福に印刷しますが、ファイルを変更したり、変更したりはしません変更タイムスタンプを更新します。

Bash標準では、一見無視されているように見える> 3番目のステートメント-そして、もっと重要なことは、それはdoingなのか?

Bashは_<>_を使用して 読み取り/書き込みファイル記述子 を作成します。

リダイレクト演算子

_[n]<>Word
_

wordを拡張した名前のファイルが、ファイル記述子nで、またはnが指定されていない場合はファイル記述子0で、読み取りと書き込みの両方のために開かれます。ファイルが存在しない場合は作成されます。

_cat <> file_はfile読み取り/書き込みを開き、記述子0(標準入力)にバインドします。普通に標準入力に書き込もうとする人はいないので、賢明に書いたプログラムの_< file_と本質的に同等ですが、できれば可能です。

単純なCプログラムを作成して、それを直接テストできます。write(0, "hello", 6)は、標準入力を介してhellofileに書き込みます。

_<>_は 他のPOSIX準拠のシェルでも機能します と同じ効果があります。

47
Michael Homer

_<> file_は、ファイルを(デフォルトでは_<_のように、ファイル記述子0(stdin)でread + writeモードで開きます切り捨てなしおよび- ファイルが事前に存在しなかった場合は作成する

これは、open()システムコールに渡される_O_RDWR|O_CREAT_フラグに対応します。対照的に、_<_は_O_RDONLY_であり、_>_は_O_WRONLY|O_CREAT|O_TRUNC_および_>>_ _O_WRONLY|O_CREAT|O_APPEND_です。

アプリケーションが通常stdinに書き込みを行わないため、stdinを書き込み可能にすることは、多くの場合役に立ちません。アプリケーションは通常、起動時に受け取るファイル記述子に読み取りおよび書き込むことを期待しません。通常、それらはstdin(または自分で開くファイル記述子)から読み取り、stdoutまたはstderr(または自分で開くファイル記述子)に書き込みます。

_<>_には次の用途があります。

  • fileが存在しない場合にコマンドを失敗させたくないが、代わりに空のfileを作成する場合は、_cat <> file_よりも_cat < file_を優先することができます。
  • _<>_の切り捨てのない側面により、所定の場所にあるファイルを上書きすることが役立ちます。ただし、その場合は通常、ファイル記述子0では使用しません。

    _printf xxx 1<> file
    _

    fileの最初の3バイトをxxxに置き換えます。

  • Linuxなどの一部のシステムでは、名前付きパイプ(FIFO)の_<>_は、ブロックせずに(他のプロセスが他端を開くのを待たずに)名前付きパイプを開き、パイプ構造が存続することを保証します。たとえば、

    _mkfifo pipe; sed 's/foo/bar/g' <> pipe
    _

    sedは、他の任意の数のプロセスからの書き込みデータを処理し、eofを認識しません。

40