Wie kann ich das Ergebnis von einem which
Befehl an cd
weiterleiten?
Das versuche ich zu tun:
which oracle | cd
cd < which oracle
Aber keiner von ihnen funktioniert.
Gibt es eine Möglichkeit, dies zu erreichen (anstatt natürlich zu kopieren / einfügen)?
Bearbeiten: Beim zweiten Gedanken würde dieser Befehl fehlschlagen, da die Zieldatei KEIN Ordner / Verzeichnis ist .
Also denke ich nach und arbeite einen besseren Weg aus, um den nachfolgenden "/ oracle" Teil jetzt loszuwerden (sed oder awk oder sogar Perl) :)
Edit: Okay, das habe ich am Ende:
cd `which oracle | sed 's/\/oracle//g'`
dirname
,basename
?Antworten:
Sie verwenden Pipe in Fällen, in denen der Befehl Parameter von der Standardeingabe erwartet. ( Mehr dazu ).
Mit
cd
Befehl ist das nicht der Fall. Das Verzeichnis ist das Befehlsargument. In diesem Fall können Sie die Befehlsersetzung verwenden. Verwenden Sie Backticks oder$(...)
speichern Sie den Befehl in einer Variablen, um ihn auszuwerten.obwohl es viel einfacher gemacht werden kann:
oder wenn Ihr Pfad Sonderzeichen enthält
oder
Dies entspricht der Backtick-Notation, wird jedoch empfohlen (Backticks können mit Apostrophen verwechselt werden).
.. aber es sieht so aus wie du willst:
(was Ihnen zeigt, dass Sie das Verschachteln einfach verwenden können)
$(...)
(sowie Backticks) funktionieren auch in Zeichenfolgen in doppelten Anführungszeichen, was hilfreich ist, wenn das Ergebnis möglicherweise Leerzeichen enthält.(Beachten Sie, dass für beide Ausgänge doppelte Anführungszeichen erforderlich sind.)
quelle
cd "$(dirname "$(which oracle)")"
.|
öffnet einen neuen Prozess, so dass selbst wenncd
von STDIN gelesen,cmd | cd
dies nicht funktionieren würde (dh das aktuelle Verzeichnis im ursprünglichen Prozess würde gleich bleiben).Mit dirname, um das Verzeichnis zu erhalten:
BEARBEITEN: Achten Sie auf Pfade, die Leerzeichen enthalten, siehe @ anishpatel Kommentar unten
quelle
cd "$(which oracle | xargs -0 dirname)"
diese Option, wenn der Pfad Leerzeichen enthalten kann. Das Flag -0 teilt die Eingabe eher durch Null als durch Leerzeichen.Beachten Sie, dass dies Backticks sind (im Allgemeinen die Taste links von 1 auf einer US-Tastatur).
quelle
cd "`which oracle`"
OK, hier eine Lösung, die korrektes Zitieren verwendet:
Vermeiden Sie Backticks, sie sind weniger lesbar und zitieren immer Prozessersetzungen.
quelle
Sie brauchen keine Pipe, Sie können mit der Bash-Parametererweiterung machen, was Sie wollen!
Weiterer Tipp: Verwenden Sie "type -P" anstelle des externen Befehls "which", wenn Sie Bash verwenden.
quelle
Als Antwort auf Ihre bearbeitete Frage können Sie den Namen des Befehls entfernen, indem Sie
dirname
:quelle
Neben der obigen guten Antwort muss erwähnt werden, dass cd eine eingebaute Shell ist, die im selben Prozess ausgeführt wird, außer dem neuen Prozess wie ls, der ein Befehl ist.
/unix/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd
http://en.wikipedia.org/wiki/Shell_builtin
quelle