一時ファイルを使用する以外に入力をバッファリングできますが、インポート中にstdin
エラーが発生する方法/プログラムはありますかEOF
?また、シェル変数(例:)を使用したくありませんbuffer=$(cat)
。
プログラムは次のようになります(プログラム名があると仮定buffered-cat
)。
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
これでプログラムはそれを受け取り^D
、buffered-cat
内容を出力します。
line 1
line 2
line 3
答え1
あなたはこれを行うことができますsponge
moreutilsから。sponge
「標準入力を受け取り、ファイルに書き込みます」。引数がない場合、ファイルは標準出力です。コマンドへの入力はEOFまでメモリに保存され、一度にすべて書き込まれます。
通常のファイルに書き込むには、ファイル名を指定するだけです。
cmd | sponge filename
主な目的sponge
は、パイプから同じファイルを読み書きできるようにすることですが、ユーザーの要件にも適している可能性があります。
答え2
貧しい人々がsponge
使用していますawk
:
awk '{a[NR] = $0} END {for (i = 1; i <= NR; i++) print a[i]}'
お持ちの場合tac
、これを乱用する可能性があります。
... | tac | tac
答え3
入力がASCIIテキスト(最後までNUL 0x0バイトを含まない)の場合は、必要な操作をsed -z
実行してください。
$ sed -z ''
Line 1
Line 2
Line 3
^D
Line 1
Line 2
Line 3
$
-z
sed
NULバイトが通常の改行文字ではなく行区切り文字として扱われる理由です。したがって、入力がNULバイトのないプレーンテキストの場合、sedはEOFに達するまで入力全体をモードバッファに読み込み続けます。 sed
その後、バッファに対して何もせずに出力します。
入力にNULバイトがある場合は、次のことができます。
sed ':l;N;bl'
答え4
Pythonを除いて、muruのawkの例と同じアイデアです。CtrlD1行ずつ読み取りを停止するために使用されます。
$ python -c 'import sys;print("".join(sys.stdin.readlines()))'
line1
line2
line3 # press Enter and Ctrl+D at this point
line1
line2
line3