Yönteminizi biraz uyarlayabilirsiniz. cowsay
Doğrudan boru oluşturmak yerine, sınırlayıcı bir karaktere kadar çıktıyı okuyun, bu çıktıya gönderin cowsay
, ardından her komuttan sonra bu karakteri yazdırın:
exec > >(while IFS= read -d '' -r line; do if [[ -n $line ]]; then echo; printf "%s\n" "$line" | cowsay; fi; done)
PROMPT_COMMAND='printf "\0"'
Burada ASCII NUL karakterini kullanıyorum. Komut çıkışında görünmesi olası olmayan başka bir şey kullanabilirsiniz.
Bu komut isteminden sonra yazdırılır, böylece çıktı çirkin olur:
$ 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 |
|| ||
Bunun karmaşık çıktıyı deneyen veya bir metin kullanıcı arabirimi (komut satırı düzenleyicileri, çağrı cihazları vb.) Olan herhangi bir komutu kıracağını unutmayın.
Ne yaptığını zaten bildiğinizi varsayarsak exec > >(...)
, işlem ikamesindeki kısım:
while IFS= read -d '' -r line; do ... done
: Bu, ASCII NUL karakteri tarafından sınırlanan verileri okumak için oldukça yaygın bir deyimdir:
IFS=
IFS'yi alan bölünmesini devre dışı bırakan boş dizeye ayarlar
-r
girişte özel olarak read
işlem görmesini engeller \
(bu nedenle \n
örneğin, \n
yeni satır karakterine dönüştürülmez ve okunmaz ).
-d ''
read
NUL karakterine kadar okumayı söylemenin yolu
Böylece, her şey girdinin içeriğini mümkün olduğunca korurken, NUL ile sınırlandırılmış bölümlerde girdi üzerinde dolaşır.
if [[ -n $line ]]; then ... fi; done
- sadece şu ana kadar okunan giriş boş değilse hareket edin.
echo; printf "%s\n" "$line" | cowsay;
- boş bir satır yazdırın, böylece cowsay çıktısı istem ile çakışmaz ve daha sonra okunan girdiyi cowsay'a gönderir. printf
daha güvenilir ve güvenlidir echo
.
-n
Bayrağını kullanmakcowsay
yararlıdır; beyaz alanı korumasını sağlar.