Question Toujours exécuter une commande après une autre commande


Avec zsh (et oh-my-zsh), est-il possible de toujours exécuter une commande après une autre commande? Je veux toujours courir un ls après cddans un répertoire, plutôt que de courir cd example; ls à chaque fois.

J'ai essayé:

function cd {
  cd $1
  ls
}

Mais il semble sortir zsh lorsqu'il est exécuté, sans aucune sortie (débordement de pile?). Changer le nom de la fonction le fait fonctionner comme prévu, mais je préfère quand même utiliser le cd commander.

alias cd='cd $1;ls'

Répertorie le répertoire spécifié, mais ne modifie pas réellement le répertoire de travail.

Est-il possible de faire cela et si oui, comment?


6
2018-05-30 00:25


origine


le && commande pourrait être utile. (par exemple. alias cd='cd $1;ls && ls). - Hennes
Je ne pense pas que les alias conviennent à ce genre de chose, utilisez plutôt une fonction. - evilsoup
@Hennes qui semble être ls le répertoire actuel et le nouveau, mais ne déplace toujours pas le shell réel. - JJJollyjim
Ah! Non connecté à un zsh atm, mais && ls $1 ? - Hennes
@evilsoup je suis d'accord, la fonction dans mon message quand renommé fonctionne. Comment puis-je le faire fonctionner encore appelé cd? - JJJollyjim


Réponses:


Bien que vous ayez déjà résolu vous-même le problème, je veux élaborer un peu.

Pourquoi votre alias ne fonctionne pas:

@evilsoup l’a déjà dit, mais pour le dire clairement: les alias (dans zsh et frapper) ne sont pas en mesure de prendre des arguments (alors que dans csh ils peuvent). Considérez-le comme un simple remplacement de chaîne. D'où avec alias cd='cd $1;ls' défini, la commande cd foo se développe à cd ; ls foo car $1 est vide (pas défini dans ce contexte) et vous voyez le contenu de foo/ mais la coquille fait cd dans le actuel répertoire (pas d'argument après cd).

Pourquoi votre fonction comme dans la question ne fonctionne pas:

Vous définissez une fonction cdqui appelle lui-même cd. Donc, vous vous retrouvez dans une boucle infinie. La version actuelle de zsh (5.0.2) ne se sépare pas, mais donne une erreur:

cd:1: maximum nested function level reached

La solution est d'utiliser builtin cd à l'intérieur de votre fonction cd - comme tu as déjà travaillé toi-même.

Pourquoi votre fonction (de ) peut être amélioré

Vous redéfinissez le cd fonction. Cela fonctionne bien, si vous l'appelez explicitement. Mais zsh offre le AUTO_CD option (à définir avec setopt AUTO_CD):

Si une commande est émise qui ne peut pas être exécutée comme une commande normale,   et la commande est le nom d'un répertoire, effectuez                 la commande cd vers ce répertoire.

Cela signifie que vous pouvez changer pour /var en tapant simplement /var au lieu de cd /var. Dans ce cas, votre cd la fonction n'est pas appelée et vous n'avez pas vu le contenu de /var automatiquement

pushd et popd sont d'autres cas où une redéfinition cd commande n'aide pas.

La voie ZSH

Stéphane Chazelas sur SE / UL a déjà donné la voie zsh-ish, comme indiqué par @evilsoup dans les commentaires: Ne pas redéfinir cd, mais utilisez la fonction crochet chpwd(), qui est là pour exactement cette raison:

chpwd  Exécuté chaque fois que le répertoire de travail en cours est modifié.

Alors ajoutez simplement

function chpwd() {
  ls
}

à ton ~/.zshrc. (Une forme courte de cela est chpwd() ls comme indiqué dans la réponse liée.)


9
2018-05-30 10:30





Ce poster sur Unix / Linux le résolut pour moi:

function cd {
  builtin cd "$@" && ls -F
}

Il s'agit de bash, mais travaille pour moi dans zsh.


3
2018-05-30 00:44