Sintiéndose como un idiota en este momento. ¿Por qué esto no funciona?
echo "/some/directory/path" | xargs -n1 cd
Sintiéndose como un idiota en este momento. ¿Por qué esto no funciona?
echo "/some/directory/path" | xargs -n1 cd
Respuestas:
La tubería ejecuta xargs en un subproceso y xargs ejecuta cd en un subproceso. Los cambios en un subproceso no se propagan al proceso padre.
cd `echo "/some/directory/path" | cut -d\ -f1`
(Tenga en cuenta que agregué 'cortar' para dividir en espacios y tomar el primer elemento de la manera que lo hace xargs)
xargs
no puede ejecutarse cd
ya que es, necesariamente, un shell integrado y xargs
solo puede ejecutar ejecutables independientes. Sin embargo, lo que dijo es cierto sobre los subprocesos.
cd `port file libcudd | sed -e 's/\/Portfile//'`
(generalmente las largas que no desea manejar manualmente, como esta ubicación de MacPorts Portfile).
El comando cd
está integrado porque la información sobre el directorio actual está vinculada a un proceso y solo el shell integrado puede cambiar el directorio actual del shell en ejecución.
Hay dos problemas con su código:
xargs
no se puede ejecutar cd
porque cd
es un comando incorporado y xargs
solo puede ejecutar archivos ejecutables.cd
un subproceso llamado desde xargs
, no tendrá ningún efecto en el proceso principal como se explicó anteriormente.La solución es ejecutar un sub-shell, dentro de él ejecutar cd
y luego puede ejecutar comandos en el nuevo directorio actual.
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
ls | xargs ...
en este ejemplo. Debería pasar el valor para $0
, comoecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'