Fühle mich jetzt wie ein Idiot. Warum geht das nicht?
echo "/some/directory/path" | xargs -n1 cd
Die Pipe führt xargs in einem Unterprozess aus, und xargs führt cd in einem Unterprozess aus. Änderungen in einem Unterprozess werden nicht an den übergeordneten Prozess weitergegeben.
cd `echo "/some/directory/path" | cut -d\ -f1`
(Beachten Sie, dass ich 'cut' hinzugefügt habe, um Leerzeichen aufzuteilen und das erste Element wie xargs zu greifen.)xargs
kann nicht ausgeführt werden,cd
da es aus der Not einer Schale builtin undxargs
kann nur freistehende ausführbare Dateien ausführen. Was Sie gesagt haben, gilt jedoch für Unterprozesse.cd `port file libcudd | sed -e 's/\/Portfile//'`
(normalerweise lange, die Sie nicht manuell verarbeiten möchten, wie dieser MacPorts Portfile-Speicherort).Der Befehl
cd
ist ein integrierter Befehl, da die Informationen zum aktuellen Verzeichnis an einen Prozess gebunden sind und nur der integrierte Shell- Befehl das aktuelle Verzeichnis der ausgeführten Shell ändern kann.Es gibt zwei Probleme mit Ihrem Code:
xargs
kann nicht ausgeführt werden,cd
dacd
es sich um einen integrierten Befehl handelt undxargs
nur ausführbare Dateien ausgeführt werden können.cd
einen Unterprozess ausführen , der von aufgerufenxargs
wird, hat dies keine Auswirkungen auf den übergeordneten Prozess, wie oben erläutert.Die Lösung besteht darin, eine Sub-Shell
cd
auszuführen, in der Sie Befehle im neuen aktuellen Verzeichnis ausführen können.quelle
ls | xargs ...
In diesem Beispiel ist das nicht sinnvoll . Es sollte den Wert für übergeben werden$0
, wieecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'