Ejecutar cd en una función bash llamada por subshell causa salida extraña

2

Considera la función bash:

func() {
  cd /;
  echo test;
}

Llamarlo hace lo que esperas:

~:>func
test
/:>

Pero cuando se llama desde una subshell (p. ej., usar backticks o $ ()) se realiza de forma muy extraña.

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

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

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

Esto está causando problemas con algunos scripts que se basan en ciertos comportamientos de salida, por ejemplo, CLASSPATH=$(func) , donde func es complejo y requiere el uso de cd .

Lo 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 informa "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.

    
pregunta Ed Marty 13.01.2017 - 20:58

1 respuesta

1

Parece que ocurre algo extraño, ya que 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 el comando cd tenga un alias en algún lugar. El comando alias 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 debería enumerar las funciones definidas, al menos en bash , y puede ver si cd se define como una función.

Con suerte, el comando which puede admitir formas abreviadas de realizar estas comprobaciones. Visite esta página de manual en línea para ver cómo se puede usar una implementación de which para verificar funciones y alias , luego ve si tu which opera de una manera similar.

    
respondido por el Greg Tarsa 14.01.2017 - 06:01

Lea otras preguntas en las etiquetas