Comment insérer des tabulations avant les lignes de sortie d'une commande exécutée

16

Juste une petite question. Est-il possible de tabuler la sortie sur Ubuntu 16.04 LTS? J'ai créé deux images ci-dessous pour essayer d'illustrer ce que je veux dire par là.

img1

img2

Alex Ng
la source
1
Serait-il correct si vous devez diriger la sortie de la commande via une autre commande comme YOUR COMMAND | indentou si vous devez taper une autre commande devant elle (pourrait même être seulement un trait de soulignement) comme _ YOUR COMMAND?
Byte Commander
1
@ByteCommander J'ai considéré cela, mais je le fais pour la facilité d'utilisation et pour rendre la sortie de la console plus facile à lire. Donc, je ne pense pas que canaliser toutes mes commandes est la solution. Merci pour la réponse et éditez cependant!
Alex Ng
1
[Veuillez ne pas publier de captures d'écran de la sortie de texte. ] ( meta.askubuntu.com/q/8713/85695 )
terdon

Réponses:

15

Vous pourriez faire quelque chose comme ça - avec des descripteurs de fichiers:

  1. enregistrer le descripteur de sortie actuel afin que nous puissions le restaurer plus tard

    exec 3>&1
  2. rediriger le flux de sortie vers une substitution de processus qui insère l'onglet - par exemple

    exec 1> >(paste /dev/null -)

À partir de ce point, tout processus qui écrit sur la sortie standard verra cette sortie «filtrée» via la pastecommande pour insérer des onglets au début.

  1. Lorsque vous avez terminé, vous pouvez reprendre un comportement normal en restaurant le descripteur de fichier enregistré et en fermant le descripteur temporaire

    exec 1>&3 3>&-
tournevis
la source
Je vous remercie pour la réponse. C'est la solution la plus proche que j'ai trouvée, même si elle n'est pas parfaite.
Alex Ng
@AlexNg merci pour le vote positif - en quoi spécifiquement ne fait-il pas ce que vous avez demandé? si vous me le faites savoir, je vais essayer de l'améliorer
steeldriver
Pour donner quelques exemples: Après avoir entré vos commandes, certaines commandes fonctionnent comme prévu, comme 'php -v', 'hostname' et d'autres. Cependant, lorsque vous utilisez une commande telle que «echo Hello World», la sortie est affichée en ligne avec l'entrée et elle affecte également l'apparence visuelle de l'entrée lors de la saisie de la commande suivante. Certaines autres commandes ne sont également pas affectées par le processus de tabulation, comme lors de la saisie d'une commande non valide telle que «asdasd».
Alex Ng
Enfin, il n'affiche pas correctement la sortie qui change (je ne sais pas comment décrire cela correctement, excuses). Par exemple, si la commande «apt-get update» est utilisée, il existe des différences notables lors de la comparaison avec une console sans le processus de tabulation.
Alex Ng
Le problème est que cette approche ne gère que STDOUT (flux 1), mais pas STDERR (flux 2). Il casse également la sortie des programmes qui utilisent lessou des outils similaires pour permettre le défilement de la sortie, comme par exemple man.
Byte Commander
9

Je comprends que cette réponse n'est pas optimale pour vous, mais vous pouvez créer une fonction Bash avec le nom simple _(ou toute autre chose qui n'est pas encore utilisée) qui exécute la commande qu'elle obtient en tant qu'arguments et met en retrait toute sa sortie avec un onglet.

Un exemple:

$ _ lsb_release -a
        No LSB modules are available.
        Distributor ID: Ubuntu
        Description:    Ubuntu 16.04 LTS
        Release:    16.04
        Codename:   xenial

Le code de cette fonction ne serait que ceci:

_(){ sed "s/^/\t/" <($*); }

Vous pouvez l'ajouter à votre ~/.bashrcfichier afin qu'il soit disponible dans toutes les sessions Bash de votre utilisateur en exécutant:

echo '_(){ sed "s/^/\t/" <($*); }' >> ~/.bashrc

Si vous souhaitez le rendre disponible à tous les utilisateurs, ajoutez-le à la /etc/bash.bashrcplace (nécessite des droits d'administrateur):

echo '_(){ sed "s/^/\t/" <($*); }' | sudo tee -a /etc/bash.bashrc

Alternativement, vous pouvez également créer un fichier de script /usr/local/bin/_avec le contenu suivant pour obtenir le même sans fonctions Bash et pour tous les utilisateurs:

#!/bin/bash
sed "s/^/\t/" <($*)

Vous devez rendre le script exécutable après avoir enregistré le fichier à l'aide de

sudo chmod +x /usr/local/bin/_
Byte Commander
la source
5

Avec echospécifiquement, vous pouvez lui faire interpréter les échappements antislash comme \t(un taquet de tabulation ) avec le -ecommutateur:

echo -e "\tHello World"

Mais il ne serait guère possible (ou probablement possible) de modifier la sortie de chaque commande de cette façon. Si la facilité de lecture est votre objectif, vous pouvez envisager de personnaliser l'apparence (par exemple la coloration) de votre invite de commande, comme illustré ici:

Vous pouvez personnaliser votre invite en modifiant le contenu de la variable d'environnement PS1. Vous pouvez voir un petit exemple de la façon de le faire dans le billet de blog de la capture d'écran ci-dessus. Comment utiliser en détail ces soi-disant séquences d'échappement ANSI, comment utiliser des outils plus confortables, comment appliquer les modifications par défaut dans de nouveaux terminaux, etc., dépassent le cadre de cette réponse. Mais si vous décidez d'utiliser cette technique, il existe de nombreux didacticiels et d'autres informations sur le Web.

Henning Kockerbeck
la source
Merci pour la réponse, mais j'ai déjà changé la PS1 à mon goût.
Alex Ng