Se sentir comme un idiot en ce moment. Pourquoi ça ne marche pas?
echo "/some/directory/path" | xargs -n1 cd
Se sentir comme un idiot en ce moment. Pourquoi ça ne marche pas?
echo "/some/directory/path" | xargs -n1 cd
Réponses:
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 fonctionner cd
car il s'agit nécessairement d'un shell intégré et xargs
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écuter cd
car cd
est une commande intégrée et xargs
ne peut exécuter que des fichiers exécutables.cd
dans un sous-processus appelé depuis xargs
, 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.
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
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'