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.)
xargskann nicht ausgeführt werden, cdda es aus der Not einer Schale builtin und xargskann 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 cdist 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:
xargskann nicht ausgeführt werden, cdda cdes sich um einen integrierten Befehl handelt und xargsnur ausführbare Dateien ausgeführt werden können.cdeinen Unterprozess ausführen , der von aufgerufen xargswird, hat dies keine Auswirkungen auf den übergeordneten Prozess, wie oben erläutert.Die Lösung besteht darin, eine Sub-Shell cdauszufü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'