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, cdrozważany jest tylko jego pierwszy argument, którym w tym przypadku jest -.
To, co prawdopodobnie zamierzałeś napisać, to cdpolecenie 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 $OLDPWDjuż 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 $someplacelub cd -) ustawia się $? = 1po 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 setna drugim dysku CD; podczas gdy sekwencja cd /tmp bash cd $OLDPWDspada do ~ (prawie na pewno, ponieważ $ OLDPWD rozwija się do pustego ciągu). cd $OLDPWDbędzie działał dobrze, gdy wykonasz przynajmniej jedną z cdtych 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
$OLDPWDjest rozbrojony, spowoduje to wpadnięcie do ciebie~.cd -wydrukuje błąd (i prawdopodobnie pozostawi cię tam, gdzie już byłeś).