Fühle mich jetzt wie ein Idiot. Warum geht das nicht?
echo "/some/directory/path" | xargs -n1 cd
Fühle mich jetzt wie ein Idiot. Warum geht das nicht?
echo "/some/directory/path" | xargs -n1 cd
Antworten:
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 und xargs
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
da cd
es sich um einen integrierten Befehl handelt und xargs
nur ausführbare Dateien ausgeführt werden können.cd
einen Unterprozess ausführen , der von aufgerufen xargs
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.
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
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'