Je voudrais modifier mon .bashrc afin que chaque commande exécutée sur le shell soit dirigée vers quelque chose, par exemple:
$ sudo apt update
_________________
< sudo apt update >
-----------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
J'ai réussi quelque chose d'assez similaire, mais pas entièrement:
$ bash
$ exec > >(cowsay)
$ echo "Hello AU!"
$ exit
_______
< Hello AU! >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Ce n'est pas le résultat souhaité, car il ne se produit qu'après avoir quitté le shell actuel.
C'est principalement à des fins de plaisir / d'apprentissage.
command-line
bash
bashrc
M. Becerra
la source
la source
-n
drapeau pourcowsay
est utile; cela lui permet de préserver les espaces blancs.Réponses:
Vous pouvez adapter un peu votre méthode. Au lieu de passer
cowsay
directement à, lisez la sortie jusqu'à un caractère de délimitation, envoyez cette sortie àcowsay
, puis imprimez ce caractère après chaque commande:Ici, j'utilise le caractère ASCII NUL. Vous pouvez utiliser autre chose qui n'apparaîtra probablement pas dans la sortie de la commande.
Cela s'imprimera après l'invite, donc la sortie sera moche:
Notez que cela cassera toute commande qui essaie une sortie complexe ou qui a une interface utilisateur de texte (pensez aux éditeurs de ligne de commande, aux pagers, etc.).
En supposant que vous savez déjà ce qui se
exec > >(...)
passe, la partie de la substitution de processus est:while IFS= read -d '' -r line; do ... done
: il s'agit d'un idiome assez courant pour lire des données délimitées par le caractère ASCII NUL:IFS=
définit l'IFS sur la chaîne vide, ce qui désactive la division des champs-r
empêcheread
de traiter\
spécialement l'entrée (ainsi,\n
par exemple, est lu comme\n
et n'est pas converti en caractère de nouvelle ligne).-d ''
est la façon de direread
de lire jusqu'à ce que le caractère NULDonc, le tout boucle sur l'entrée dans des sections délimitées par NUL, tout en préservant le contenu de l'entrée autant que possible.
if [[ -n $line ]]; then ... fi; done
- agir uniquement si l'entrée lue jusqu'à présent n'est pas vide.echo; printf "%s\n" "$line" | cowsay;
- imprimer une première ligne vide, afin que la sortie de cowsay ne se heurte pas à l'invite, puis envoyer l'entrée lue jusqu'à présent à cowsay.printf
est plus fiable et plus sûr queecho
.la source
Vous pouvez
trap
et abuser duDEBUG
signal de bash :Exemple d'exécution
Cependant, cela exécutera toujours la commande par la suite. Grâce à ilkkachu, j'ai trouvé un moyen de contourner cela:
la source