web-dev-qa-db-fra.com

Bash: espaces dans le nom d'alias

J'essaie de créer un alias dans bash. Ce que je veux faire, c'est mapper ls -la à ls -la | more

Voici ce que j'ai essayé dans mon fichier .bashrc:

alias 'ls -la'='ls -la | more'

Cependant, cela ne fonctionne pas car (je suppose) il y a des espaces dans le nom d'alias. Y a-t-il un moyen de contourner ce problème?

112
sixtyfootersdude

La documentation de Bash indique "Dans la plupart des cas, les fonctions de Shell sont préférées aux alias." Voici une fonction Shell qui remplace ls et provoque le routage de la sortie vers more si l'argument est constitué de (uniquement) -la.

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

En une ligne:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Tuyauter automatiquement la sortie:

ls -la
120
Dennis Williamson

Depuis la page de manuel des alias :

Le premier mot de chaque commande simple, s'il n'est pas cité, est vérifié pour voir s'il a un alias. Si c'est le cas, ce mot est remplacé par le texte de l'alias. Le nom d'alias et le texte de remplacement peuvent contenir toute entrée Shell valide, y compris les métacaractères Shell, à l'exception du fait que le nom d'alias peut ne pas contenir "=".

Ainsi, seul le premier mot est vérifié pour les correspondances d'alias, ce qui rend impossible les alias multi-mots. Vous pourrez peut-être écrire un script shell qui vérifie les arguments et appelle votre commande s’ils concordent et appelle simplement la variable normale ls (voir @ réponse de Dennis Williamson )

49
heavyd

Une approche légèrement améliorée tirée de la réponse de Dennis:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

Ou le one-liner:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

Cela permet d’ajouter d’autres options/arguments après la commande, par exemple ls -la -h.

14
ld_pvl