2 votes

Exécuter cd dans une fonction bash appelée par un sous-shell provoque une sortie superflue

Considérez la fonction bash:

func() {
  cd /;
  echo test;
}

L'appeler fait ce à quoi vous vous attendez:

~:>func
test
/:>

Mais quand il est appelé à partir d'un sous-shell (par exemple en utilisant des backticks ou $()), il se comporte de manière très étrange.

~:>func() { cd /; echo test; }
~:>echo $(func)
test Saving session... ...saving history...truncating history files... ...completed.
~:>

Ce problème n'apparaît pas si cd n'est pas exécuté dans la fonction:

~:>func() { echo test; }
~:>echo $(func)
test
~:>

Cela pose problème à certains scripts qui dépendent de certains comportements de sortie, par exemple CLASSPATH=$(func)func est complexe et nécessite l'utilisation de cd.

Ce qui est étrange, c'est que cela fonctionnait bien avant. Cela n'a commencé à se produire que récemment, mais je ne sais pas ce qui aurait pu causer cela.

Note: alias cd indique "alias: cd: not found" et which cd renvoie /usr/bin/cd qui est un script identique à un autre Mac qui n'a pas le problème.

2voto

Greg Tarsa Points 238

Il semble y avoir quelque chose d'étrange car cd n'est pas défini pour se comporter comme vous le voyez. Des preuves suggèrent que sa définition est annulée quelque part.

Il est possible que votre commande cd soit aliassée quelque part. La commande alias sans arguments affichera une liste de commandes aliassées sur la plupart des shells. Une solution de contournement pour une commande aliassée est de préfixer la commande avec un backslash (\cd). Cela met entre guillemets la première lettre de la commande et contourne tout traitement d'alias par le shell.

Il est également possible qu'il s'agisse d'une fonction shell. declare -f devrait répertorier les fonctions définies, du moins dans bash, et vous pouvez voir si cd est défini en tant que fonction.

Avec un peu de chance, votre commande which peut prendre en charge des moyens abrégés pour effectuer ces vérifications. Consultez cette page de manuel en ligne pour savoir comment une implémentation de which peut être utilisée pour vérifier les fonctions et les alias, puis voyez si votre which fonctionne de manière similaire.

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