La ejecución de cd en una función bash llamada por subshell provoca una salida extraña

2

Considere la función de bash:

func() {
  cd /;
  echo test;
}

Llamarlo hace lo que cabría esperar:

~:>func
test
/:>

Pero cuando se llama desde una subshell (p. Ej., Utilizando backticks o $ ()) se ejecuta de manera muy extraña.

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

Este problema no aparece si cd No se ejecuta en la función:

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

Esto está causando problemas con algunos scripts que dependen de cierto comportamiento de salida, por ejemplo, CLASSPATH=$(func) dónde func Es complejo y requiere el uso de cd.

Lo que es extraño es que esto funcionó bien antes. No comenzó a suceder hasta hace poco, pero no sé qué lo habría causado.

Nota: alias cd informes "alias: cd: no encontrado" y which cd devuelve / usr / bin / cd, que es un script que es idéntico a otro Mac que no tiene el problema.

Ed Marty
fuente
1
Parece que la función se ejecuta en su propia shell de alguna manera. Aunque no puedo reproducir esto aquí. ¿Cambiaste algo en tu configuración de shell recientemente?
nohillside
¿Eso viene de tu ~/.bash_logout?
Mark Setchell
No he cambiado nada recientemente, pero puede haber ocurrido una actualización del sistema operativo.
Ed Marty
Yo tampoco tengo ~ / .bash_logout
Ed Marty

Respuestas:

1

Parece que hay algo extraño como cd No está definido para comportarse como lo estás viendo. La evidencia sugiere que su definición está siendo anulada en alguna parte.

Es posible que tu cd El comando tiene un alias en alguna parte. los alias el comando sin argumentos mostrará una lista de comandos con alias en la mayoría de los shells. Una solución para un comando con alias es prefaciar el comando con una barra invertida ( \cd ). Eso cita la primera letra del comando y anula cualquier procesamiento de alias por parte del shell.

También es posible que sea una función de shell. declare -f Enumerar las funciones definidas, al menos en bash, y puedes ver si cd Se está definiendo como una función.

Con suerte tu which El comando puede admitir formas abreviadas de realizar estas comprobaciones. Revisa esta página de manual en línea por cómo una implementación de which puede utilizarse para verificar funciones y alias, luego ver si su which Funciona de manera similar.

Greg Tarsa
fuente
Lo intenté \cd pero no tuvo efecto. Nota: alias cd informes "alias: cd: no encontrado" y which cd devuelve / usr / bin / cd, que es un script que es idéntico a otro Mac que no tiene el problema.
Ed Marty
gs cd debe estar integrado en su shell en la mayoría de los casos.
Greg Tarsa
Huzzah declare -f cd da como resultado un script que parece haber sido instalado por Ruby.
Ed Marty
Ah! Rubí. Debes estar usando rvm para gestionar tus rubies. Creo que la implementación requiere la redefinición de cd. ¡Me alegra que lo hayas descubierto!
Greg Tarsa