Saya memiliki fungsi bash yang mengambil file sebagai parameter, memverifikasi file yang ada, kemudian menulis apa pun yang datang stdin ke file. Solusi naif berfungsi dengan baik untuk teks, tetapi saya mengalami masalah dengan data biner sewenang-wenang.
echo -n '' >| "$file" #Truncate the file
while read lines
do # Is there a better way to do this? I would like one...
echo $lines >> "$file"
done
> $file
. Ini hanya berfungsi sebagai hal pertama yang mencari stdin di skrip shell induk. Pada dasarnya semua kode David dapat direduksi menjadi satu karakter, tetapi saya pikircat -
ini lebih elegan dan lebih sedikit masalah karena dipahami pada pandangan.cat
bersama-sama, hanya untuk mengganggu fanatik UUOCcat
agar orang yang bersikeras menggunakannya harus melakukan senam mental untuk membaca kode. Pipa yang diberi nama juga merupakan target yang baik.Untuk membaca file teks secara harfiah, jangan gunakan file biasa
read
, yang memproses output dengan dua cara:read
menafsirkan\
sebagai karakter pelarian; gunakanread -r
untuk mematikan ini.read
terbagi menjadi kata-kata pada karakter dalam$IFS
; setelIFS
ke string kosong untuk mematikannya.Idiom biasa untuk memproses file teks baris demi baris adalah
Untuk penjelasan tentang idiom ini, lihat Mengapa
while IFS= read
sering digunakan, bukanIFS=; while read..
? .Untuk menulis string secara harfiah, jangan hanya menggunakan plain
echo
, yang memproses string dengan dua cara:echo
proses backslash lolos. (Pada bash, itu tergantung apakahxpg_echo
opsi diatur.)-n
atau-e
(set yang tepat tergantung pada shell).Cara portabel untuk mencetak string adalah dengan
printf
. (Tidak ada cara yang lebih baik dalam bash, kecuali Anda tahu input Anda tidak terlihat seperti opsi untukecho
.) Gunakan formulir pertama untuk mencetak string yang tepat, dan bentuk kedua jika Anda ingin menambahkan baris baru.Ini hanya cocok untuk memproses teks , karena:
Anda tidak dapat memproses data biner di shell, tetapi versi utilitas modern di sebagian besar unix dapat mengatasi data yang berubah-ubah. Untuk meneruskan semua input ke output, gunakan
cat
. Bersinggungan,echo -n ''
adalah cara yang rumit dan tidak portabel dalam melakukan apa pun;echo -n
akan sama baiknya (atau tidak tergantung pada shell), dan:
lebih sederhana dan sepenuhnya portabel.atau, lebih sederhana,
Dalam skrip, Anda biasanya tidak perlu menggunakan
>|
karenanoclobber
dinonaktifkan secara default.sumber
Ini akan melakukan apa yang Anda inginkan:
Perhatikan penggunaan memori. Ini membaca input dengan cara tanpa batas nol.
Jika tidak ada byte
\0
nol dalam input maka bash pertama-tama harus membaca seluruh isi input ke dalam memori, dan kemudian mengeluarkannya.Mengenai langkah terpotong Anda:
yang jauh lebih sederhana dan setara adalah:
sumber