> brew install moreutils
==> Downloading https://homebrew.bintray.com/bottles/moreutils-0.55.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring moreutils0.55.yosemite.bottle.tar.gz
🍺 /usr/local/Cellar/moreutils/0.55: 67 files, 740K
spons membaca input standar dan menuliskannya ke file yang ditentukan. Tidak seperti pengalihan shell, spons menyerap semua inputnya sebelum menulis file output. Ini memungkinkan membangun saluran pipa yang membaca dari dan menulis ke file yang sama.
Saya tidak mengerti. Tolong beri saya beberapa contoh berguna.
Apa artinya menyerap ?
expand foo.txt | sponge foo.txt
. Lihat juga: stackoverflow.com/a/33639324/1959808Jawaban:
Asumsikan bahwa Anda memiliki file bernama
input
, Anda ingin menghapus semua baris mulai dengan#
diinput
. Anda bisa mendapatkan semua baris jangan mulai dengan#
menggunakan:Tapi bagaimana Anda membuat perubahan
input
? Dengan toolchest POSIX standar, Anda perlu menggunakan file sementara, beberapa hal seperti:Dengan pengalihan shell:
akan terpotong
input
sebelum Anda membacanya.Dengan
sponge
, Anda dapat:sumber
<>
operator.>
dan<
,<>
tidak merusak file kecuali ada yang salah. Anda dapat dengan mudah menulis byte demi byte menggunakannya. Misalnya, coba gunakan dengantr
.<>file
, Anda membuka file untuk membaca dan menulis tetapi Anda sebenarnya tidak menulis apa pun ke file.<>
tidak memotong file, tetapi hanya mengganti byte yang ada dengan output baru. Jika output baru terlalu pendek, Anda akan memiliki sisa sampah di akhir file. Tetapi jika output baru cukup lama, tidak ada risiko.Halaman muka moreutils sendiri mendokumentasikan kasus penggunaan umum:
Di sini, / etc / passwd ditulis dan dibaca, dan sedang dimodifikasi. Tanpa melonggarkan stdin sebelum menulis, / etc / passwd mungkin rusak (karena file berubah saat membaca).
sumber