Verwenden Sie "cd -" ohne Ausgabe

28

Wie führe ich den cd -Befehl aus, ohne eine Ausgabe auszugeben?
Ich habe es versucht, cd - 2>&1 /dev/nullaber das druckt das Zielverzeichnis aus.
Der Grund dafür ist, dass ich es als Bash-Funktion verwenden möchte und es mir vorziehen würde, keine unnötige Ausgabe zu haben.

Batandwa
quelle

Antworten:

32

Versuchen Sie es wie folgt:

cd - > /dev/null

Sie können auch tun:

cd - > uselessfile

Dadurch wird die Ausgabe an die Datei "uselessfile" anstatt an STDOUT gesendet.

Sie können die Datei auch anhängen, anstatt sie zu erstellen oder zu überschreiben.

cd - >> uselessfile
Erewok
quelle
15

@erewok hat die Frage bereits beantwortet , aber ich werde kurz erläutern, was tatsächlich passiert und warum Sie das Verhalten sehen, das Sie tun.

Das Problem liegt in Ihrer Weiterleitung. Du schreibst:

cd - 2>&1 /dev/null

Was, weil Umleitungen überall in der Befehlszeile auftreten können (Sie können dies selbst mit etwas Einfachem wie bestätigen echo a b 2>&1 c </etc/fstab d), nachdem Umleitungen entfernt wurden, wird tatsächlich zu:

cd - /dev/null

Sehen Sie das Problem? Sie übergeben zwei Argumente an cd, nicht ein Argument und zwei Umleitungen. Da Sie sich immer nur in einem aktuellen Verzeichnis befinden können, wird cdnur das erste Argument berücksichtigt, in diesem Fall das -.

Was Sie wahrscheinlich schreiben wollten , ist ein cdBefehl mit Umleitung von stderr und stdout nach / dev / null. Dafür gibt es zwei Möglichkeiten.

In Ihrem Fall ist es am einfachsten, die Shell durch Hinzufügen eines >Zeichens über die gewünschte Umleitung zu informieren . Das schlägt @erewok vor.

cd - 2>&1 >/dev/null

Dabei wird zuerst stderr (Dateideskriptor 2) in Dateideskriptor 1 (stdout) und dann stdout (implizit 1) in / dev / null umgeleitet. Beachten Sie, dass die Reihenfolge wichtig ist. Sie erhalten nicht das gleiche Ergebnis, wenn Sie die Umleitungen umkehren. In einigen Fällen kann es jedoch vorkommen, dass Sie dies tun, weil das jeweilige Programm die entsprechenden Ausgabestreams verwendet.

Alternativ, wie von vorgeschlagen @demure vorgeschlagen , &>beide Streams gleichzeitig umleiten, wenn diese Syntax von Ihrer Shell unterstützt wird.

cd - &>/dev/null

Beachten Sie, dass eine dieser Alternativen den Fehler auch dann stilllegt, wenn er $OLDPWDnicht mehr vorhanden ist, da Sie die Standardfehlerausgabe in das schwarze Loch des Systems umleiten. Wenn dies ein Problem ist, würde ich es anschließend überprüfen $?. Sie sollten dies selbst bestätigen, wenn es ein echtes Anliegen ist, aber zumindest in meinen Tests ein fehlgeschlagenes cd(ob cd $someplaceoder cd -) setzt $? = 1dabei nach Erfolg$? = 0 .

ein CVn
quelle
5

Vielleicht kannst du verwenden

cd $OLDPWD

aber in diesem Fall müssen Sie mehr eingeben :)

Sie haben jedoch einen Vorteil: Wenn ein Fehler auftritt, wird die Nachricht nicht nach / dev / null umgeleitet.

Uzsolt
quelle
1
Wenn $OLDPWDnicht festgelegt, werden Sie darauf hingewiesen ~. cd -druckt einen Fehler aus (und lässt Sie vermutlich dort zurück, wo Sie bereits waren).
ein Lebenslauf
1
Du hast nicht recht. Wenn $ OLDPWD deaktiviert ist (warum? Vielleicht kann der Benutzer dies deaktivieren), hat das 'cd -' dasselbe Ergebnis wie "cd $ OLDPWD". Überprüfen Sie die Manpage ('cd -' entspricht 'cd "$ OLDPWD" && pwd'). Oder Sie können es testen :) 'OLDPWD = ""; cd - '- sehen Sie, dass Sie in ~ vorbeischauen und ein ~ -Zeichen drucken.
Uzsolt
1
Ich habe es gerade getestet. Auf meinem System cd /tmp bash cd -steht bash: cd: OLDPWD not setauf der zweiten CD: Während die Sequenz cd /tmp bash cd $OLDPWDSie in ~ fallen lässt (mit ziemlicher Sicherheit, weil $ OLDPWD zu einer leeren Zeichenfolge erweitert wird). cd $OLDPWDfunktioniert einwandfrei, wenn Sie mindestens eine cdin der betreffenden Shell ausgeführt haben, jedoch nicht vor diesem Zeitpunkt.
ein Lebenslauf
Hm, ja, du hast recht. Ich habe mit zsh getestet und mit zsh wird keine Fehlermeldung gelöscht.
Uzsolt
1

Stdout und stderr umleiten: cd - &>/dev/null

das &>ist die short hand version von cd - 2>/dev/null 1>&2, die ich was ich denke du wolltest benutzen ...

  • Note &>benötigt bash> = 4.0.

Ps. Die meisten Befehle können auf Orte gerichtet werden, so dass es unwahrscheinlich ist, dass Sie dies tatsächlich tun müssencd

zurückhaltend
quelle
0

Sie können verwenden:

cd ~-

Laut der Bash-Manpage unter Tilde Expansion :

Wenn das Tilde-Präfix ein "~ -" ist, wird der Wert der Shell-Variablen OLDPWD, sofern festgelegt, ersetzt.

Dru
quelle