Antworten:
@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 cd
nur das erste Argument berücksichtigt, in diesem Fall das -
.
Was Sie wahrscheinlich schreiben wollten , ist ein cd
Befehl 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 $OLDPWD
nicht 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 $someplace
oder cd -
) setzt $? = 1
dabei nach Erfolg$? = 0
.
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.
cd /tmp
bash
cd -
steht bash: cd: OLDPWD not set
auf der zweiten CD: Während die Sequenz cd /tmp
bash
cd $OLDPWD
Sie in ~ fallen lässt (mit ziemlicher Sicherheit, weil $ OLDPWD zu einer leeren Zeichenfolge erweitert wird). cd $OLDPWD
funktioniert einwandfrei, wenn Sie mindestens eine cd
in der betreffenden Shell ausgeführt haben, jedoch nicht vor diesem Zeitpunkt.
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 ...
&>
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
$OLDPWD
nicht festgelegt, werden Sie darauf hingewiesen~
.cd -
druckt einen Fehler aus (und lässt Sie vermutlich dort zurück, wo Sie bereits waren).