Bash: espaces dans le nom d'alias

117

J'essaie de créer un alias dans bash. Ce que je veux faire est la carte ls -ladels -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?

soixantefootersdude
la source
8
Pourquoi ne pas fairealias lsm='ls -la | more'
Nifle

Réponses:

126

La documentation de Bash indique "Dans presque tous les cas, les fonctions du shell sont préférées aux alias". Voici une fonction shell qui remplace la lssortie et la dirige vers morela sortie 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; }

Tuyau automatiquement la sortie:

ls -la
Dennis Williamson
la source
1
pourquoi avez-vous besoin d'utiliser des doubles crochets à l'intérieur de l'instruction if?
Sixtyfootersdude
1
@sixtyfootersdude: La forme à double crochet est plus puissante et je l'utilise par habitude. Voir mywiki.wooledge.org/BashFAQ/0/031
Dennis Williamson le
Alors, quelle est la commande finale? alias ls = 'ls ()' ??
Jeef
1
@ Joef: Non, ma réponse utilise une fonction au lieu d'un alias. Je l'ai édité pour essayer de le rendre plus clair.
Dennis Williamson
6
@merlinpatt: commandempêche l' appel de la fonction de manière récursive.
Dennis Williamson
53

De la page de manuel d'alias :

Le premier mot de chaque commande simple, s'il n'est pas entre guillemets, 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 n'importe quelle entrée de shell valide, y compris les métacaractères du 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 sinon appelle la normale ls(Voir la réponse de @Dennis Williamson )

lourd
la source
8
+1 Pour expliquer pourquoi je ne suis pas autorisé à utiliser ls -la comme alias.
Sixtyfootersdude
7
C'était utile car au lieu d'essayer de le résoudre, cela répondait à la question. Je suis venu ici parce que je voulais créer un alias avec un espace et cela n'arrivera tout simplement pas.
angryundead
Cela a non seulement répondu à ma question, mais m'a aussi permis de mieux comprendre le fonctionnement du mécanisme de crénelage. Votre citation de la page de manuel a été très utile.
Lily Finley le
14

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, si nécessaire, par exemple ls -la -h

ld_pvl
la source
2
Comment cela se passe-t-il si je veux ls -latêtre exclu de ce traitement? J'aurais besoin de mettre un cas pour le gérer au-dessus de l' -la*entrée, oui?
Steven Lu
-1

Vous pouvez toujours invoquer cet alias, mais vous avez besoin d'une citation pour que l'espace fasse partie du mot de commande. Alors "ls -la" -p patternpassera l' -p patternoption à more, pas ls.

Charles Stewart
la source