Se sentir comme un idiot en ce moment. Pourquoi ça ne marche pas?
echo "/some/directory/path" | xargs -n1 cd
Le canal exécute xargs dans un sous-processus et xargs exécute cd dans un sous-processus. Les modifications dans un sous-processus ne sont pas propagées au processus parent.
cd `echo "/some/directory/path" | cut -d\ -f1`
(Notez que j'ai ajouté «couper» pour diviser les espaces et récupérer le premier élément comme le fait xargs)xargs
ne peut pas fonctionnercd
car il s'agit nécessairement d'un shell intégré etxargs
ne peut exécuter que des exécutables autonomes. Cependant, ce que vous avez dit est vrai au sujet des sous-processus.cd `port file libcudd | sed -e 's/\/Portfile//'`
(généralement les longs que vous ne voulez pas gérer manuellement, comme cet emplacement de port MacPorts).La commande
cd
est intégrée car les informations sur le répertoire en cours sont liées à un processus et seul le shell intégré peut changer le répertoire en cours du shell en cours d'exécution.Il y a deux problèmes avec votre code:
xargs
ne peut pas s'exécutercd
carcd
est une commande intégrée etxargs
ne peut exécuter que des fichiers exécutables.cd
dans un sous-processus appelé depuisxargs
, cela n'aura aucun effet sur le processus parent comme expliqué ci-dessus.La solution consiste à exécuter un sous-shell, à l'intérieur de celui-ci s'exécuter
cd
et ensuite vous pouvez exécuter des commandes dans le nouveau répertoire courant.la source
ls | xargs ...
dans cet exemple. Il devrait passer la valeur pour$0
, commeecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'