Saya ingin mengedit .bashrc saya sehingga setiap perintah yang dijalankan pada shell disalurkan ke sesuatu, misalnya:
$ sudo apt update
_________________
< sudo apt update >
-----------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Saya telah mengelola sesuatu yang agak mirip, tetapi tidak sepenuhnya:
$ bash
$ exec > >(cowsay)
$ echo "Hello AU!"
$ exit
_______
< Hello AU! >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Ini bukan hasil yang diinginkan, karena hanya terjadi setelah keluar dari shell saat ini.
Ini terutama untuk tujuan belajar / bersenang-senang.
command-line
bash
bashrc
M. Becerra
sumber
sumber
-n
bendera untukcowsay
berguna; itu membuatnya melestarikan spasi.Jawaban:
Anda dapat sedikit menyesuaikan metode Anda. Alih-alih
cowsay
mengirim langsung, baca output hingga karakter pembatas, kirim output itu kecowsay
, lalu cetak karakter itu setelah setiap perintah: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:
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
mencegahread
memperlakukan\
dalam input secara khusus (jadi,\n
misalnya, dibaca sebagai\n
dan tidak dikonversi ke karakter baris baru).-d ''
adalah cara untuk mengatakanread
membaca sampai karakter NULJadi 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 daripadaecho
.sumber
Anda dapat
trap
dan menyalahgunakanDEBUG
sinyal bash :Contoh dijalankan
Namun, ini masih akan menjalankan perintah sesudahnya. Berkat ilkkachu saya menemukan jalan keluarnya :
sumber