Puis-je modifier une commande de terminal pour faire des choses supplémentaires?

8

J'ai cherché des alias, des fonctions ... mais je n'ai rien trouvé de satisfaisant. Permettez-moi de vous donner quelques scénarios:

  • 95% des fois que je suis cddans un dossier, je fais un suivi avec une ls commande.
  • 90% des fois que je mkdir, je cdme suis dedans.

Vous avez eu l'idée.

Quelle serait la façon la plus "propre" de lier ces commandes (ou d'autres fonctionnalités)?

Carles Alcolea
la source
5
Pourquoi les alias n'ont-ils pas fonctionné pour vous?
Thorbjørn Ravn Andersen du
2
Le résultat cd de mkdir devrait-il alors clouer sur le ls?
bmike
@bmike Eh bien, un répertoire nouvellement créé sera vide, donc ls n'affiche rien.
Random832
@ Random832 vous ne supposez aucun drapeau sur ls, mais plus important encore, ma question révélera comment un changement cassé / lourd est souhaité. Je préfère les alias aux fonctions, mais les deux peuvent essayer ce qui est demandé.
bmike
1
@ fd0 Je ne doute pas que les alias n'aient pas fonctionné. Je demande pourquoi. Il pourrait y avoir une solution plus simple au problème.
Thorbjørn Ravn Andersen

Réponses:

4

Vous pouvez mettre ces lignes dans votre .zsrhcou.bashrc

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

Résultat ->

entrez 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 se trouve après cette ligne ne s'applique qu'aux sessions interactives, donc cela n'affecte pas le comportement de cd dans les scripts.

Plus d'informations sur ce commentaire :

[-z "$ PS1"] vérifie si la $ PS (variable d'invite interactive) est de "longueur nulle" (-z). S'il est de longueur nulle, cela signifie qu'il n'a pas été défini, donc Bash ne doit pas être exécuté en mode interactif. La partie && return quitte le sourcing .bashrc à ce stade, dans ces conditions.

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

Éditer :

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

StrawHara
la source
1
En général, n'utilisez pas le même nom que les commandes standard comme cd ls rm, etc. car vous devrez utiliser ces commandes standard
user151019
@Mark Je suis d'accord pour 'rm -rf ~ / *' ^^ Mais pour une commande cd, ce n'est pas vraiment dangereux. Et Carles veut «mettre à niveau les commandes existantes», alors ...
StrawHara
Je dois dire que j'utilise cette solution depuis que @StrawHara l'a publiée et que j'ai eu 0 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
Carles Alcolea
13

J'aurais tendance à faire une nouvelle commande pour cela. Je pense qu'il serait même logique de les combiner en un seul.

go() {
    if [ -d "$1" ]; then
        cd "$1" && ls
    else
        mkdir -p "$1" && echo "Created directory $1" && cd "$1"
    fi
}
Aléatoire832
la source
J'aime votre idée en combinant ces derniers! :-)
Martin Allert
5
Cette réponse est également la plus propre car elle ne perturbe pas la définition par défaut de cd / mkdir lorsqu'il est utilisé par des scripts
holroy
1
Bien sûr, mais si vous décidez de commencer à utiliser le langage de programmation Go? : P
arxanas
@arxanas: Vous utilisez des makefiles? ;-)
DevSolar
2
hmmm j'aime celui-ci. mais si vous tapez par erreur le nom, vous créez un nouveau répertoire. Est-il difficile d'implémenter une vérification sur un congé (cd /.... ou ../ou quelque chose) et de supprimer le répertoire s'il est vide? Je veux dire que si vous quittez un répertoire, vérifiez simplement s'il est vide et si oui, supprimez-le. si vous ne le souhaitez pas, vous pouvez toujours utiliser cd au lieu de partir
Schwertspize
6

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 constaté que cela peut gâcher les scripts qui utilisent les commandes remplacées et que la gestion des options peut être fragile (par exemple, si vous souhaitez passer -pà la mkdircommande ci-dessus , elle est également transmise à cd). Il serait préférable de simplement définir des alias avec des noms différents (par exemple, cou mcd).

arxanas
la source
1
l'insertion [ -z "$PS1" ] && returnà la fin du fichier, avant ces fonctions, devrait aider
Carles Alcolea
5

Je pense que les fonctions sont la voie à suivre. Quelque chose comme

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

par exemple.

fd0
la source