Użyj „cd -” bez żadnego wyjścia


28

Jak uruchomić cd -polecenie bez echa wyjścia?
Próbowałem, cd - 2>&1 /dev/nullale drukuje katalog docelowy.
Powodem tego jest to, że chciałbym użyć go jako funkcji bashowej i wolałbym nie mieć niepotrzebnego wyjścia.

Odpowiedzi:


32

Spróbuj tak:

cd - > /dev/null

Możesz także:

cd - > uselessfile

Spowoduje to wysłanie danych wyjściowych do pliku „bezużyteczny plik” zamiast do STDOUT.

Możesz także dołączyć zamiast tworzyć lub zastępować plik.

cd - >> uselessfile

15

@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.


5

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.


1
Jeśli $OLDPWDjest rozbrojony, spowoduje to wpadnięcie do ciebie ~. cd -wydrukuje błąd (i prawdopodobnie pozostawi cię tam, gdzie już byłeś).
CVn

1
Nie masz racji. Jeśli $ OLDPWD jest rozbrojone (dlaczego? Może użytkownik może to rozbroić), „cd -” ma taki sam wynik jak „cd $ OLDPWD”. Sprawdź stronę podręcznika („cd -” jest odpowiednikiem „cd” $ OLDPWD ”i& pwd”). Lub możesz to przetestować :) 'OLDPWD = ""; cd - '- zobaczysz, że wpadniesz do ~ i wydrukujesz znak ~.
uzsolt

1
Właśnie to przetestowałem. W moim systemie sekwencja 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.
CVn

Hm, tak, masz rację. Testowałem z Zsh i Zsh nie upuszcza komunikatu o błędzie.
uzsolt

1

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 ...

  • Uwaga &>wymaga bash> = 4.0.

Ps. większość poleceń może być wskazywana w lokalizacjach, więc jest mało prawdopodobne, że tak naprawdę potrzebujeszcd


0

Możesz użyć:

cd ~-

Według strony podręcznika bash pod Tilde Expansion:

Jeśli przedrostek tyldy to `~ - ', wartość zmiennej powłoki OLDPWD, jeśli jest ustawiona, jest podstawiana.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.