Journal Se souvenir de ses alias bash

Posté par  . Licence CC By‑SA.
Étiquettes :
11
28
juil.
2013

Bonjour,

Mes vacances sont finies, demain c'est la reprise, oh que c'est dur. Durant mes quelques semaines de farniente, je me suis rendu compte que le fichier de mon shell, bash en l'occurrence (certes avec le mode vi activé) était rempli d'alias et de fonctions : présent en premier lieu pour me simplifier la vie - c'est leur rôles - mais aussi pour stocker des commandes à rallonge utilisées trois fois dans l'année. Cela m'arrive donc d'oublier carrément leur existence. C'est pour cela que je me suis créé une fonction shell qui me permet d'afficher mes alias et leur commentaire associés (l'affichage d'une aide pour les fonctions shell pourrait bientôt venir)

La syntaxe à tenir dans le fichier ~/.bashrc (ou un autre) pour que cette fonction produise le résultat escompté est le suivant :

̀`bash
alias bye="exit" # this is an alias for exit
`

La fonction permettant d'afficher l'ensemble des alias couplés au commentaire est alors la suivante :

alias_help()
{
  f=~/.bashrc
  my_aliases=$(egrep '^\s*alias\s+.+=' ${f}|sed -r 's/\s*alias\s+(.+)=\".+\"(\s*#\s*(.+))?/\1: \3;/')
  echo $my_aliases|tr ';' '\n'
}

Si cela peut être utile aux personnes parcourant ce site, qui comme moi créé des alias à gogo sans se souvenir de leur existence trois mois plus tard, cette fonction est placée sous la licence WTFPL.

Si des personnes plus calées que moi en shell veulent apporter leur correction à cette superbe fonction, et je ne doute pas qu'elles pourraient être quelques unes, qu'elles me corrige (je suis sûr qu'une seule ligne serait suffisante)

  • # alias

    Posté par  (site web personnel) . Évalué à 10.

    Salut,

    Pourquoi n'utilises-tu pas simplement la commande "alias" ?

    sebastien@cao:~$ alias
    alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
    alias egrep='egrep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias grep='grep --color=auto'
    alias l='ls -CF'
    alias la='ls -A'
    alias ll='ls -alF'
    alias ls='ls --color=auto'
    
    • [^] # Re: alias

      Posté par  . Évalué à 3.

      pas mieux ;)

      • [^] # Re: alias

        Posté par  (site web personnel) . Évalué à 9.

        peut-être que c'est pour permettre d'afficher le commentaire qui suit la déclaration de l'alias ?

        « I approve of any development that makes it more difficult for governments and criminals to monopolize the use of force. » Eric Raymond

    • [^] # Re: alias

      Posté par  . Évalué à 6.

      Bonjour,

      effectivement, il me semblait bien qu'il y avait un truc tout bête pour lister ses alias, seulement mon objectif était de coupler le nom de l'alias avec une aide simple comme on pourrait le faire en python pour une fonction par exemple et non de lier le nom de l'alias avec le code shell associé.

      Dire que vous vous n'en avez rien à faire de la vie privée parce que vous n'avez rien à cacher, c'est comme dire que vous n'en avez rien à faire de la liberté d'expression parce que vous n'avez rien à dire. Edward Snowden

    • [^] # Commentaire supprimé

      Posté par  . Évalué à 5.

      Ce commentaire a été supprimé par l’équipe de modération.

    • [^] # Re: alias

      Posté par  (site web personnel) . Évalué à 1.

      Pourquoi n'utilises-tu pas simplement la commande "alias" ?

      Alors là je suis clairement mort de rire ! encore une que je ne connaissais pas :-D

      sinon naïvement j'aurais fais.

      grep "alias" ~/.bashrc

      Moins long que la regex proposée et fonctionne plutôt bien.

      kentoc'h mervel eget bezan saotred

  • # Et ça ?

    Posté par  . Évalué à 3.

    grep ^alias ~/.bashrc

    ?

    • [^] # Re: Et ça ?

      Posté par  . Évalué à 4. Dernière modification le 28 juillet 2013 à 16:01.

      En fait je précise (je n'avais pas bien lu), la commande que je donne est utile si dans ton fichier .bashrc (ou autre, genre .bash_aliases) tes alias sont définis ainsi :

      alias truc='commande' # commentaire

      Avec le commentaire sur la même ligne.

      • [^] # Re: Et ça ?

        Posté par  . Évalué à 1.

        Oui, c'est la syntaxe à tenir comme je l'ai précisé même si le code à sauter durant la publication (peut-être qu'un modérateur présent pourra corriger) => Le commentaire doit se trouver sur la ligne de l'alias.
        En tout cas, un simple grep n'apporte pas la lisibilité que j'ai recherché pour ma liste d'alias car, à minima, je ne souhaite pas y faire apparaître le code.

        Dire que vous vous n'en avez rien à faire de la vie privée parce que vous n'avez rien à cacher, c'est comme dire que vous n'en avez rien à faire de la liberté d'expression parce que vous n'avez rien à dire. Edward Snowden

        • [^] # Re: Et ça ?

          Posté par  . Évalué à 2.

          je ne souhaite pas y faire apparaître le code

          OK je comprends, par souci de lisibilité je suppose.

          Par contre je ne suis pas sûr que ce soit vraiment pertinent (mais je n'ai peut-être pas bien saisi ton besoin).

          S'il s'agit de pouvoir faire le tri je suppose qu'en affichant ta liste, si tu vois une ligne comme ça :

          toto # alias ad-hoc créer pour une occasion précise

          tu vas bien quand même aller voir la commande en question avant de le supprimer non ? Arf oui, en éditant le fichier pour supprimer tu vas forcément voir la commande, c'est pas faux…

          Par contre, pour éviter d'avoir des trucs devenus inutiles dans ton .bashrc tu peux déjà mettre tous tes alias dans .bash_aliases, c'est fait pour.

          • [^] # Re: Et ça ?

            Posté par  . Évalué à 2.

            Bonjour,

            Non mon but était uniquement d'afficher chacun de mes alias, couvrant plusieurs domaines (ssl, le réseau, le développement, l'accès aux bases de données, etcétéra) couplé avec un commentaire pour aider ma petite mémoire. Maintenant je comprend tout à fait que des personnes préfère la commande alias voir même un grep ^alias plutôt qu'un sed un peu violent qui mériterait sûrement d'être amélioré.

            Dire que vous vous n'en avez rien à faire de la vie privée parce que vous n'avez rien à cacher, c'est comme dire que vous n'en avez rien à faire de la liberté d'expression parce que vous n'avez rien à dire. Edward Snowden

  • # UUoG ?

    Posté par  (site web personnel) . Évalué à -1.

    On parle bien de Bash ? Alors pourquoi ne pas l'utiliser :

    while IFS= read a;do [[ -z "${a//*alias*/}" ]] || continue; b="${a##*#}"; a="${a##*alias }";echo "${a%%=*}: $b"; done <~/.bashrc
    

    Au pire sans Bash :

    awk '/^[[:space:]]*alias[[:space:]]*/ {a=$2;gsub (/=.*/,"",a);gsub(/.*#/,"",$0); print a ":",$0}' ~/.bashrc
    

    En plus, ça reste plus simple à lire…

    • [^] # Re: UUoG ?

      Posté par  . Évalué à 2.

      Ou simplement le beau one-liner suivant :

       sed -rn 's/^\s*alias\s+(.+)=\"?.+\"(\s*#\s*(.+))?/\1: \3/ p' ~/.bashrc
      
      • [^] # Re: UUoG ?

        Posté par  . Évalué à 8.

        Comme ça on pourra mettre cette ligne dans le .bashrc et lui affecter un alias, dont il faudra se souvenir, mais pas de soucis puisque tu disposeras de l'alias permettant de lister les alias (ou pas…)

      • [^] # Re: UUoG ?

        Posté par  (site web personnel) . Évalué à 1.

        sed -rn 's/\s*alias\s+(.+)=\"?.+\"(\s*#\s*(.+))?/\1: \3/ p' ~/.bashrc

        Marche pas chez moi.

        kentoc'h mervel eget bezan saotred

      • [^] # Re: UUoG ?

        Posté par  . Évalué à 1.

        Bonjour,

        J'étais parti sur egrep et donc du coup comme je n'y arrivais pas avec lui uniquement, je l'ai pipé à sed. Mais c'est vrai que seul sed suffirait je pense. Cette commande fonctionne très bien dans le shell directement alors j'ai voulu en faire un alias du style (comme ça la boucle est bouclée comme ironiquement dit dans un commentaire) :

        alias alias_help="sed -rn 's/^\s*alias\s+(.+)=\"?.+\"(\s*#\s*(.+))?/\1: \3/ p' ~/.bashrc" # this help

        Seulement le résultat escompté n'est pas le bon, je suis déçu car comme ça je ne vois pas et je n'ai plus beaucoup de temps pour jouer avec une expression régulière :(

        Dire que vous vous n'en avez rien à faire de la vie privée parce que vous n'avez rien à cacher, c'est comme dire que vous n'en avez rien à faire de la liberté d'expression parce que vous n'avez rien à dire. Edward Snowden

        • [^] # Re: UUoG ?

          Posté par  . Évalué à 1.

          Une alternative avec AWK (le séparateur de champ est "#"; la ligne commence par un nombre quelconque d'espaces suivis par "alias"; copier le dernier champ dans la variable f, remplacer les suites d'espaces et de signes égale par le séparateur de champs; imprimer le deuxième champ+deux points+f):

          alias aka="awk -F# '/^ *alias/{f=\$NF;gsub(/[= ]+/,\"#\");print \$2\":\"f}' ~/.bashrc"
        • [^] # Re: UUoG ?

          Posté par  . Évalué à 1.

          Seulement le résultat escompté n'est pas le bon

          Tu pourrais donner un exemple ?

          Chez moi :

          $ tail -1 ~/.bashrc
          alias x="foo" # plop
          $ alias alias_help="sed -rn 's/^\s*alias\s+(.+)=\"?.+\"(\s*#\s*(.+))?/\1: \3/ p' ~/.bashrc"
          $ alias_help
          x: plop
          

          sur Debian squeeze.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.