8 votes

Puis-je modifier une commande de terminal pour effectuer des tâches supplémentaires?

J'ai examiné les alias, les fonctions... mais je n'ai rien trouvé de satisfaisant. Laissez-moi vous donner quelques scénarios :

  • 95% du temps que je cd dans un dossier, je suis ensuite avec une commande ls.
  • 90% du temps que je mkdir, je me cd moi-même dedans.

Quel serait le moyen le plus "propre" de lier ces commandes ensemble (ou une autre fonctionnalité) ?

5 votes

Pourquoi les alias n'ont-ils pas fonctionné pour vous ?

2 votes

Alors, le cd résultat de mkdir devrait-il ajouter le ls?

0 votes

@bmike Eh bien, un répertoire nouvellement créé sera vide, donc ls n'affichera rien.

13voto

Random832 Points 681

Je tendrais à créer une nouvelle commande pour cela. Je pense même qu'il serait logique de les combiner en une seule.

go() {
    if [ -d "$1" ]; then
        cd "$1" && ls
    else
        mkdir -p "$1" && echo "Répertoire créé $1" && cd "$1"
    fi
}

0 votes

J'aime ton idée de combiner ceux-ci! :-)

5 votes

Cette réponse est également la plus propre car elle ne perturbe pas la définition par défaut de cd/mkdir lorsqu'elle est utilisée par des scripts

1 votes

Bien sûr, mais que se passe-t-il si vous décidez de commencer à utiliser le langage de programmation Go ? :P

6voto

Ofir Points 1474

J'ai essayé d'ajouter des choses comme celles-ci à mon .bashrc :

cd() {
    command cd "$@"
    command ls
}

mkdir() {
    command mkdir "$@"
    command cd "$@"
}

Cependant, j'ai trouvé que cela peut perturber les scripts qui utilisent les commandes remplacées, et la manipulation des options peut être fragile (par exemple, si vous souhaitez passer -p à la commande mkdir ci-dessus, il est également passé à cd). Il serait préférable de simplement définir des alias avec des noms différents (par exemple, c ou mcd).

1 votes

Insérer [ -z "$PS1" ] && return à la fin du fichier, avant ces fonctions, devrait aider

5voto

Michael Zhou Points 167

Je pense que les fonctions sont la meilleure option. Quelque chose comme

chglist() {
    cd "$1" && ls
}

comme exemple.

4voto

StrawHara Points 4305

Vous pouvez mettre ces lignes dans votre .zsrhc ou .bashrc

[ -z "$PS1" ] && return
function cd {
builtin cd "$@" && ls -F
}

Résultat ->

entrer la description de l'image ici

Explication de cette réponse:

Plus tôt dans mon .bashrc, j'ai : [ -z "$PS1" ] && return, et tout ce qui suit cette ligne s'applique uniquement aux sessions interactives, donc cela ne affecte pas le comportement de cd dans les scripts.

Autres informations provenant de ce commentaire:

[ -z "$PS1" ] vérifie si la variable $PS (variable d'invite interactive) est de "longueur zéro" (-z). Si elle est de longueur zéro, cela signifie qu'elle n'a pas été définie, donc Bash ne doit pas fonctionner en mode interactif. La partie && return quitte l'exécution de .bashrc à ce moment-là, dans ces conditions.

Au fait, merci pour la question, c'est vraiment cool :)

Édit :

Une autre solution serait d'intégrer votre ls à votre invite de commandes; je suis sûr que vous pouvez le faire avec OhMyZsh ;)

1 votes

En général, n'utilisez pas le même nom que les commandes standard telles que cd ls rm, car vous aurez besoin d'utiliser ces commandes standard

0 votes

@Mark Je suis d'accord pour 'rm -rf ~/*' ^^ Mais pour une commande cd, ce n'est pas vraiment dangereux. Et Carles veut 'mettre à jour les commandes existantes', donc...

0 votes

Je dois dire que j'utilise cette solution depuis que @StrawHara l'a publiée et je n'ai eu aucun problème. Je voulais fournir le "comment ça s'est passé" :) Et c'est vraiment utile; voici comment je l'utilise (.zshrc): i.imgur.com/WHpROIE.png

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X