Selain menggunakan file sementara untuk membantu, apakah ada cara / program dapat buffer input dari stdin
tetapi tidak menampilkan konten sampai mendapatkan EOF
. Saya juga tidak ingin menggunakan variabel shell (misalnya buffer=$(cat)
).
Program ini harus berperilaku seperti di bawah ini (anggap nama programnya buffered-cat
):
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
Sekarang setelah program diterima ^D
, buffered-cat
output isinya
line 1
line 2
line 3
sort
untuk tujuan ini. Jelas itu memiliki efek samping yang mungkin tidak diinginkan.Jawaban:
Seorang pria miskin
sponge
menggunakanawk
:Jika sudah
tac
, Anda dapat menyalahgunakannya juga:sumber
tac
sederhana dan elegan, saya pikir.| tac | tac
adalah sederhana, tapi ingat bahwa itu adalah sangat tidak efisien untuk tugas dan Anda akan menderita hit kinerja, terutama untuk file yang lebih besar.Anda dapat melakukannya dengan menggunakan
sponge
moreutils .sponge
akan "menyerap input standar dan menulis ke file". Tanpa argumen, file itu adalah output standar. Input yang diberikan untuk perintah ini disimpan dalam memori hingga EOF, dan kemudian dituliskan sekaligus.Untuk menulis ke file normal, Anda bisa memberikan nama file:
Tujuan utamanya
sponge
adalah untuk memungkinkan membaca dan menulis dari file yang sama dalam suatu pipa, tetapi ia melakukan apa yang Anda inginkan juga.sumber
Selama input Anda adalah teks ASCII (tidak mengandung NUL 0x0 byte hingga akhir), maka
sed -z
lakukan apa yang Anda inginkan:The
-z
penyebabsed
untuk mengobati byte NUL sebagai pembatas jalur bukan baris biasa. Jadi selama input Anda adalah teks biasa tanpa byte NUL, maka sed akan terus membaca seluruh input ke buffer pola sampai EOF tercapai.sed
kemudian tidak memproses buffer dan mengeluarkannya.Jika NUL byte hadir di input Anda, maka Anda bisa melakukan ini sebagai gantinya:
sumber
Ini
sed
solusi sedikit lebih lama dari DigitalTrauma, tetapi juga bekerja dengan NUL byte.sumber
sed ':l;N;bl'
harus bekerja juga.Perilaku yang Anda minta, bukankah itu perilaku standar kucing sederhana?
sumber
cat
(Enter)Line 1
(Enter) dan lihat apa yang terjadi.Gagasan yang sama dengan contoh awak muru, kecuali dengan Python. Gunakan CtrlDuntuk berhenti membaca dalam barisan
sumber
perl -e 'print <>'
(!)