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)xargs
no puede ejecutarsecd
ya que es, necesariamente, un shell integrado yxargs
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 ejecutarcd
porquecd
es un comando incorporado yxargs
solo puede ejecutar archivos ejecutables.cd
un 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
cd
y 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'