Anda dapat sedikit menyesuaikan metode Anda. Alih-alih cowsay
mengirim langsung, baca output hingga karakter pembatas, kirim output itu ke cowsay
, lalu cetak karakter itu setelah setiap perintah:
exec > >(while IFS= read -d '' -r line; do if [[ -n $line ]]; then echo; printf "%s\n" "$line" | cowsay; fi; done)
PROMPT_COMMAND='printf "\0"'
Di sini, saya menggunakan karakter ASCII NUL. Anda dapat menggunakan sesuatu yang lain yang tidak mungkin muncul di output perintah.
Ini akan mencetak setelah prompt, sehingga hasilnya akan jelek:
$ export LC_ALL=C
$ exec > >(while IFS= read -d '' -r line; do if [[ -n $line ]]; then echo; printf "%s\n" "$line" | cowsay; fi; done)
$ PROMPT_COMMAND='printf "\0"'
$ ls
$
______________________________________
/ Desktop Documents Downloads Music \
| Pictures Public Templates Videos
\ examples.desktop /
--------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
$ echo foo
$
______
< foo >
------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Perhatikan bahwa ini akan memecah perintah apa pun yang mencoba keluaran kompleks atau memiliki antarmuka pengguna teks (pikirkan editor baris perintah, pager, dll.).
Dengan asumsi Anda sudah tahu apa yang exec > >(...)
dilakukan, bagian dari proses substitusi adalah:
while IFS= read -d '' -r line; do ... done
: ini adalah ungkapan yang cukup umum untuk membaca data yang dibatasi oleh karakter ASCII NUL:
IFS=
mengatur IFS ke string kosong, yang menonaktifkan pemisahan bidang
-r
mencegah read
memperlakukan \
dalam input secara khusus (jadi, \n
misalnya, dibaca sebagai \n
dan tidak dikonversi ke karakter baris baru).
-d ''
adalah cara untuk mengatakan read
membaca sampai karakter NUL
Jadi semuanya loop atas input di bagian dibatasi-NUL, sambil mempertahankan isi input sebanyak mungkin.
if [[ -n $line ]]; then ... fi; done
- hanya bertindak jika input yang dibaca sejauh ini tidak kosong.
echo; printf "%s\n" "$line" | cowsay;
- cetak baris kosong di depan, sehingga output cowsay tidak berbenturan dengan prompt, dan kemudian mengirim input yang sudah dibaca sejauh ini ke cowsay. printf
lebih andal dan lebih aman daripada echo
.
-n
bendera untukcowsay
berguna; itu membuatnya melestarikan spasi.