Chciałbym edytować mój plik .bashrc, aby każde polecenie wykonywane w powłoce zostało potokowane do czegoś, na przykład:
$ sudo apt update
_________________
< sudo apt update >
-----------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Udało mi się zrobić coś podobnego, ale nie do końca:
$ bash
$ exec > >(cowsay)
$ echo "Hello AU!"
$ exit
_______
< Hello AU! >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Nie jest to pożądany wynik, ponieważ dzieje się to dopiero po wyjściu z bieżącej powłoki.
Przeznaczony jest głównie do zabawy / nauki.
command-line
bash
bashrc
M. Becerra
źródło
źródło
-n
flagicowsay
; dzięki temu zachowuje białe znaki.Odpowiedzi:
Możesz nieco dostosować swoją metodę. Zamiast
cowsay
bezpośrednio potokować, odczytuj dane wyjściowe do znaku ograniczającego, wyślij dane wyjściowe docowsay
, a następnie wydrukuj ten znak po każdym poleceniu:Tutaj używam znaku ASCII NUL. Możesz użyć czegoś innego, co prawdopodobnie nie pojawi się w wynikach poleceń.
Zostanie to wydrukowane po monicie, więc wynik będzie brzydki:
Zauważ, że spowoduje to uszkodzenie dowolnego polecenia, które próbuje skomplikowanych danych wyjściowych lub ma tekstowy interfejs użytkownika (pomyśl edytory wiersza poleceń, pagery itp.).
Zakładając, że już wiesz, co
exec > >(...)
robi, częścią podstawienia procesu jest:while IFS= read -d '' -r line; do ... done
: jest to dość powszechny idiom do odczytu danych ograniczonych znakiem NUL ASCII:IFS=
ustawia IFS na pusty ciąg, co wyłącza dzielenie pól-r
zapobiega specjalnemuread
traktowaniu\
danych wejściowych (\n
na przykład jest odczytywany jako\n
znak nowej linii i nie jest do niego konwertowany).-d ''
to sposób,read
aby czytać do znaku NULCałość zapętla się nad danymi wejściowymi w sekcjach rozdzielanych przez NUL, zachowując jednocześnie możliwie jak najwięcej zawartości danych wejściowych.
if [[ -n $line ]]; then ... fi; done
- działają tylko wtedy, gdy odczyt odczytany do tej pory nie jest pusty.echo; printf "%s\n" "$line" | cowsay;
- wypisz wiodącą pustą linię, aby wynik cowsay nie kolidował z pytaniem, a następnie wyślij dane wejściowe do tej pory do cowsay.printf
jest bardziej niezawodny i bezpieczniejszy niżecho
.źródło
Możesz
trap
i wykorzystujDEBUG
sygnał bash :Przykładowy przebieg
Jednak nadal będzie to wykonywać polecenie później. Dzięki ilkkachu znalazłem sposób na obejście tego:
źródło