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)
xargsne peut pas fonctionner cdcar il s'agit nécessairement d'un shell intégré et xargsne 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 cdest 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:
xargsne peut pas s'exécuter cdcar cdest une commande intégrée et xargsne peut exécuter que des fichiers exécutables.cddans 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 cdet 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'