"1<>file" シェル入力/出力リダイレクトはどのように機能しますか?

"1<>file" シェル入力/出力リダイレクトはどのように機能しますか?

他の質問でこのコードを見ましたが、答えについて言及できないので、ここに質問します。

tr '\n' '\0' < file 1<> file

この部分に興味がありますが1<>、見たこともなく、Googleでも役に立つ内容が見つかりません。

答え1

これは答えにありますスティーブン・チェイザーズ(Stephen Chazeras)が書いた。。これはPOSIX シェル機能これは具体的ではありませんbash。他のリダイレクト演算子の説明とともに、シェルのドキュメントに記載されています。

読み書きのために標準出力であるファイル記述子1を開き、それを1<>file現在のディレクトリの指定されたファイルに追加します。file

それ以前は、同じファイルの標準入力を追加しました。

tr次に、標準入力から読み込み、fileすべての改行文字をNULL文字に変更します。出力はtr同じファイルに書き戻されます。

trこれは、コマンドの結果がその中の元のデータと同じくらい長い場合に機能しますfile

結果がtr元のファイルより短い場合は、ファイルの末尾に「古いデータ」が表示されます。

$ cat file
too many @ here: @@@@
the end
$ tr -s '@' <file 1<>file
$ cat file
too many @ here: @
the end
nd

>使用できませんのでご注意ください

tr '\n' '\0' <file >file

fileこれは読み取り前に切り捨てられるためです(出力ファイルは切り捨てられませんが、まだ存在しない場合は生成されます)。tr1<>

その人も>>書けません。

tr '\n' '\0' <file >>file

これは、出力をtrファイルの末尾に追加し、古いデータがそのまま残るためです。

関連情報