Sintiéndose como un idiota en este momento. ¿Por qué esto no funciona?
echo "/some/directory/path" | xargs -n1 cd
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)xargsno puede ejecutarsecdya que es, necesariamente, un shell integrado yxargssolo 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
cdestá 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:
xargsno se puede ejecutarcdporquecdes un comando incorporado yxargssolo puede ejecutar archivos ejecutables.cdun subproceso llamado desdexargs, 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
cdy luego puede ejecutar comandos en el nuevo directorio actual.fuente
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'