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)
xargsno puede ejecutarse cdya que es, necesariamente, un shell integrado y xargssolo 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 ejecutar cdporque cdes un comando incorporado y xargssolo puede ejecutar archivos ejecutables.cdun 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 cdy 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'