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

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

cat < fileコンテンツ印刷文書標準出力として。

cat > fileCtrl+が検出されるまでstdinを読み、D入力テキストを作成します。文書

cat <> file、少なくとも私のBashバージョンでは、以下を印刷します。文書問題はありませんが(エラーなし)、ファイルは変更されず、修正タイムスタンプも更新されません。

Bash標準は、3番目のステートメントで無視されたように見える内容をどのように正当化しますか>?さらに重要なこと行為何か?

答え1

Bashは<>生成に使用します。ファイル記述子の読み書き:

リダイレクト演算子

[n]<>word

ファイルディスクリプタnまたはnが指定されていない場合は、ファイルディスクリプタ0で読み書きするために単語拡張子を持つファイルを開くようにします。ファイルが存在しない場合、ファイルが生成されます。

cat <> file読み書きをオンにして、ディスクリプタfile0(標準入力)にバインドします。< file通常、誰もが標準入力に書き込もうとしないという点で合理的に書かれたプログラムと本質的に同じです。しかし、誰かがそうすればそうすることができます。

これを直接テストするために、単純なCプログラムを書くことができます。write(0, "hello", 6)これは標準入力で作成されますhellofile

<>しなければならない他のPOSIX互換シェルでも動作します。同じ効果があります。

答え2

<> fileファイルを開く(デフォルトはファイル記述子0(stdin)、例<:)読み取り+書き込みモデル切り捨てなしそして以前にファイルがない場合は、ファイルを作成します。

これはシステムコールO_RDWR|O_CREATに渡されたフラグに対応します。open()対照的に、<O_RDONLY>例はO_WRONLY|O_CREAT|O_TRUNCと です>> O_WRONLY|O_CREAT|O_APPEND

標準入力を書き込み可能にすることは、通常、アプリケーションが標準入力に書き込まないため、あまり便利ではありません。アプリケーションは通常、読みたくありません。そして起動時に受信したファイル記述子に書き込みます。通常はstdin(または自己開かれたファイル記述子)から読み取られ、stdoutまたはstderr(または自己開かれたファイル記述子)に書き込まれます。

<>次の用途に使用できます。

  • 存在しないコマンドが失敗するのを防ぐために、空のcat <> fileコマンドを生成することをお勧めします。cat < filefilefile
  • 切り捨て防止の側面は、<>ファイルを所定の場所に上書きするのに役立ちます。ただし、この場合、通常はファイル記述子0では使用されません。

    printf xxx 1<> file
    

    最初の3バイトfilexxx

  • 一部のシステム(Linuxなど)では、ブロックされてい<>ない(他のプロセスがもう一方の端を開くのを待たずに)、名前付きパイプ(FIFO)で名前付きパイプを開くと、パイプ構造がアクティブのままになります。たとえば、

    mkfifo pipe; sed 's/foo/bar/g' <> pipe
    

    sed書き込み操作を実行する他のプロセスは着信データを処理しますが、表示されませんeof

関連情報