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)?


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;)


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
}

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).


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.

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.