Kabuğa verilen her komutu nasıl bağlarım?


14

Kabuğumda yürütülen her komutun bir şeye yönlendirilmesi için .bashrc'mi düzenlemek istiyorum, örneğin:

 $ sudo apt update
  _________________
< sudo apt update >
 -----------------
    \   ^__^
     \  (oo)\_______
        (__)\       )\/\
            ||----w |
            ||     ||

Oldukça benzer bir şey yönettim, ama tamamen değil:

$ bash
$ exec > >(cowsay)
$ echo "Hello AU!"
$ exit
 _______
< Hello AU! >
 -------
    \   ^__^
     \  (oo)\_______
        (__)\       )\/\
            ||----w |
            ||     ||

Sadece mevcut kabuktan çıktıktan sonra olduğu için istenen sonuç değildir.

Esas olarak eğlence / öğrenme amaçlıdır.


-nBayrağını kullanmak cowsayyararlıdır; beyaz alanı korumasını sağlar.
wjandrea

Yanıtlar:


12

Yönteminizi biraz uyarlayabilirsiniz. cowsayDoğ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
    • -rgirişte özel olarak readişlem görmesini engeller \(bu nedenle \nörneğin, \nyeni satır karakterine dönüştürülmez ve okunmaz ).
    • -d ''readNUL 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. printfdaha güvenilir ve güvenlidir echo.

1
Benim istemi cowsay çıkış içinde bir linebreak olduğu gibi gelmez bunun ikinci bölümü ile çatışma - belki de bir şey olmayan, rahatsız edici istemi ayarlamak?
tatlı

16

trapBash DEBUGsinyalini kötüye kullanabilir ve kötüye kullanabilirsiniz :

trap 'bash -c "$BASH_COMMAND" | cowsay' DEBUG

Örnek çalışma

$ trap 'bash -c "$BASH_COMMAND" | cowsay' DEBUG
$ echo "AU is awesome!"
 __________________
< AU is awesome! >
 ------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
AU is awesome!

Ancak, bu daha sonra komutu yürütmeye devam edecektir. İlkkachu sayesinde bunun için bir yol buldum:

$ shopt -s extdebug
$ trap 'bash -c "$BASH_COMMAND" | cowsay; false' DEBUG
$ echo "AU is awesome!"
 __________________
< AU is awesome! >
 ------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.