Odpowiedzi:
@erewok już odpowiedział na pytanie , ale postaram się wyjaśnić, co się właściwie dzieje i dlaczego widzisz swoje zachowanie.
Problem dotyczy przekierowania. Piszesz:
cd - 2>&1 /dev/null
który, ponieważ przekierowania mogą pojawiać się w dowolnym miejscu wiersza poleceń (możesz to potwierdzić za pomocą czegoś prostego, takiego jak echo a b 2>&1 c </etc/fstab d
), po usunięciu przekierowań faktycznie staje się:
cd - /dev/null
Widzisz problem? Podajesz dwa argumenty cd
, a nie jeden argument i dwa przekierowania. Ponieważ zawsze możesz znajdować się tylko w jednym bieżącym katalogu, cd
rozważany jest tylko jego pierwszy argument, którym w tym przypadku jest -
.
To, co prawdopodobnie zamierzałeś napisać, to cd
polecenie z przekierowaniem zarówno stderr, jak i stdout do / dev / null. Można to zrobić na dwa sposoby.
W twoim przypadku najłatwiej byłoby po prostu poinformować powłokę, że chcesz przekierować, dodając >
znak. To właśnie sugeruje @erewok.
cd - 2>&1 >/dev/null
Najpierw przekierowuje stderr (deskryptor pliku 2) do deskryptora pliku 1 (stdout), a następnie przekierowuje stdout (domyślnie 1) do / dev / null. Pamiętaj, że kolejność jest ważna; nie uzyskasz tego samego wyniku, jeśli odwrócisz przekierowania, chociaż w niektórych przypadkach może się wydawać, że robisz to z powodu tego, w jaki sposób dany program wykorzystuje odpowiednie strumienie wyjściowe.
Alternatywnie, jak sugeruje @demure , możesz użyć &>
do przekierowania obu strumieni jednocześnie, jeśli ta składnia jest obsługiwana przez twoją powłokę.
cd - &>/dev/null
Zauważ, że którakolwiek z tych alternatyw również wyciszy błąd, gdy $OLDPWD
już nie istnieje, ponieważ przekierowujesz standardowe wyjście błędu do systemowej czarnej dziury. Jeśli jest to problem, sprawdziłbym $?
później; powinieneś to potwierdzić sam, jeśli jest to poważny problem, ale przynajmniej w moich testach nie powiodło się cd
(czy cd $someplace
lub cd -
) ustawia się $? = 1
po sukcesie $? = 0
.
Może możesz użyć
cd $OLDPWD
ale w tym przypadku będziesz potrzebować więcej pisania :)
Ale będziesz miał przewagę: jeśli wystąpi jakiś błąd, wiadomość nie przekieruje do / dev / null.
cd /tmp
bash
cd -
mówi bash: cd: OLDPWD not set
na drugim dysku CD; podczas gdy sekwencja cd /tmp
bash
cd $OLDPWD
spada do ~ (prawie na pewno, ponieważ $ OLDPWD rozwija się do pustego ciągu). cd $OLDPWD
będzie działał dobrze, gdy wykonasz przynajmniej jedną z cd
tych powłok, ale nie wcześniej.
Przekieruj stdout i stderr:
cd - &>/dev/null
&>
jest wersja skrócona ręka cd - 2>/dev/null 1>&2
, co ja myślę, że to, co masz na myśli w użyciu ...
&>
wymaga bash> = 4.0.Ps. większość poleceń może być wskazywana w lokalizacjach, więc jest mało prawdopodobne, że tak naprawdę potrzebujeszcd
$OLDPWD
jest rozbrojony, spowoduje to wpadnięcie do ciebie~
.cd -
wydrukuje błąd (i prawdopodobnie pozostawi cię tam, gdzie już byłeś).