Question Bash: Espaces en pseudonyme


J'essaie de créer un alias en bash. Ce que je veux faire est la carte ls -la à ls -la | more

Dans mon fichier .bashrc, c'est ce que j'ai tenté:

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

Cependant, cela ne fonctionne pas car (je suppose) il a des espaces dans le nom d'alias. Y a-t-il un travail autour de cela?


96
2018-02-05 22:35


origine


Pourquoi ne pas faire alias lsm='ls -la | more' - Nifle


Réponses:


le Documentation Bash déclare "Pour presque tous les buts, les fonctions shell sont préférées aux alias." Voici une fonction shell qui remplace ls et provoque la sortie à canaliser à more si l'argument consiste en (seulement) -la.

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

Comme un one-liner:

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

Sortie de tuyau automatique:

ls -la

100
2018-02-05 23:13



Pourquoi avez-vous besoin d'utiliser des doubles crochets dans l'instruction if? - sixtyfootersdude
@sixtyfootersdude: La forme à deux crochets est plus puissante et je l'utilise par habitude. Voir mywiki.wooledge.org/BashFAQ/031 - Dennis Williamson
Alors, quelle est la commande finale? alias ls = 'ls ()' ?? - Jeef
@Jeef: 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
@merlinpatt: command empêche la fonction d'être appelée récursivement. - Dennis Williamson


Du page de manuel d'alias:

Le premier mot de chaque commande simple,   si non coté, est vérifié pour voir si   a un alias. Si oui, ce mot est   remplacé par le texte de l'alias. le   pseudonyme et le texte de remplacement   peut contenir n'importe quelle entrée de shell valide,   y compris les métacaractères de shell, avec   l'exception que le nom d'alias peut   ne contient pas "=".

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


42
2018-02-05 22:47



+1 Pour expliquer pourquoi je ne suis pas autorisé à utiliser ls -la en tant qu'alias. - sixtyfootersdude
Cela a été utile car au lieu d'essayer de le résoudre, il a répondu à la question. Je suis venu ici parce que je voulais créer un alias avec un espace et que cela n'arrivera pas. - angryundead


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


13
2017-09-26 12:42



Comment ça se passe si je veux ls -lat être exclu de ce traitement? Je devrais mettre un cas pour le gérer au-dessus du -la* entrée, oui? - Steven Lu


Vous pouvez toujours appeler cet alias, mais vous avez besoin d'une citation pour que l'espace fasse partie du mot de commande. Alors "ls -la" -p pattern passera le -p pattern option à more, ne pas ls.


-2
2018-02-05 23:34