私はファイルからの伝統的な入力リダイレクトと似たような効果がある使い方についてだけ尋ねています。
<<<"$(<file)"
私が知る限り、それは次のとおりです。
<file
私の考えでは、これらは機能的に同じです。低いレベルでは、<<<この文書は実際には同時にメモリにより多くのデータコピーを作成できます。
このタイプのリダイレクトがbashとzshの両方に存在することを知っていますが、zshのマニュアルページにいくつかの実装の詳細が含まれていますが、実装方法については慣れていません。
ベストアンサー1
(Byron RakitzisのUnixクローンの同じ演算子からインスピレーションを得た(ここでは、この演算子は)and)によって最初に導入されました<<<"$(<file)"
。zsh
<<<
rc
ksh93
$(<file)
ksh
mksh
bash
$(<file)
シェルが内容を読み取るとfile
(ブロックされたNULバイトを除くzsh
)、すべての末尾の改行が削除されて拡張されます$(<file)
(したがって、ファイル全体の内容がメモリに保存されます)。
の場合、<<< some-text
シェルはsome-text
改行文字とそれに続く改行文字を一時ファイルに保存し、ファイル記述子0で一時ファイルを開きます(最近のバージョンを含む一部のシェルでは、少なくとも少量のbash
データに対して代わりにパイプを使用できます)。
したがって、デフォルトでは、末尾の改行文字を<<<"$(<file)"
読み取るためにstdinを開くことは一時コピーfile
にのみ置き換えられます(ファイルにNULバイトが含まれていると、すべての種類の誤動作が発生しますzsh
)。
では、標準入力から読み取るために直接開きます< file
。file
もちろん、より効率的ですが(ディスクとメモリ内のコピーは含まれていません)、stdinで開かれたファイルが次のようになっていることを確認したい< file
場合があります。<<<"$(<file)"
定期的なコマンドの開始時にファイルが完全に読み込まれたことを確認するか(コマンドがファイルに書き込む場合など)、他のリダイレクト(切り捨てリダイレクトなど)file
を処理しますtr 1 2 <<< "$(<file)" > file
。
演算子がyash
サポートされていることに注意してください(パイプを使用して実装されているにもかかわらず(したがってサポートされていません)。<<<
定期的なファイル)の代わりに一時ファイル)を使用します。しかし、そうでは$(<file)
ありません。<<<"$(cat < file)"
そこで使用してください。yash
文字列は単なる文字であるため、"$(cat < file)"
有効な文字を形成しないバイトシーケンスをブロックしますが、他のシェルは通常これを正常に処理できます。