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?


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

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 )


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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.