W bash
Mam problem z ustaleniem, czego powinienem użyć?
wszystkie moje skrypty używają „>> / dev / stderr”
w wierszu polecenia, jeśli spróbuję:
echo test >>/dev/stderr
działa
echo test >> /dev/stderr
działa
echo test >/dev/stderr
działa
echo test > /dev/stderr
działa
echo test >>&2
FAILS!
echo test >> &2
FAILS!
echo test >&2
działa
echo test > &2
niepowodzenie!
Jestem gotów zmienić wszystkie moje skrypty na >&2
.
Wydaje się, że ma również duży wpływ na ssh (po su SomeUser
), gdzie w >>/dev/stderr
ogóle nie będzie działać (odmowa dostępu), tylko >&2
będzie działać.
bash
ssh
io-redirection
stderr
Moc Wodnika
źródło
źródło
su
tym, jak problem się zdarzy, zaktualizowałem pytaniesu -c 'some command'
, to polecenie jest uruchamiane przez/bin/sh
, a niebash
, więc/dev/stderr
nie jest gwarantowane zachowanie specyficzne dla bash (takie jak symulowanie w celu przekierowania, gdy nie jest dostępne).Odpowiedzi:
>& n
to składnia powłoki służąca do bezpośredniego kopiowania deskryptora pliku . Deskryptor pliku 2 to stderr; tak to działa. Możesz także powielać inne deskryptory plików, nie tylko stderr. Nie możesz tutaj użyć trybu dołączania, ponieważ duplikowanie deskryptora pliku nigdy nie jest obcinane (nawet jeśli twój stderr jest plikiem) i>&
jest jednym tokenem, dlatego nie możesz w nim wstawić spacji - ale>& 2
działa.>> name
jest inną dozwoloną składnią, gdziename
jest nazwa pliku (a token to>>
). W tym przypadku używasz nazwy pliku/dev/stderr
, co przy obsłudze specyficznej dla systemu operacyjnego (w Linuksie jest to dowiązanie symboliczne/proc/self/fd/2
) oznacza również standardowy błąd. Tryb dołączania i obcinania kończy się, robiąc to samo, gdy stderr jest terminalem, ponieważ nie można go obciąć. Jeśli Twój błąd standardowy to plik, zostanie on jednak obcięty:Jeśli widzisz błąd z
/dev/stderr
over ssh, możliwe, że administrator serwera zastosował pewne środki bezpieczeństwa uniemożliwiające działanie tego dowiązania symbolicznego. (Np. Nie możesz uzyskać dostępu/proc
lub/dev
). O ile spodziewałbym się, że spowoduje to wszelkiego rodzaju dziwne uszkodzenia, użycie składni deskryptora pliku jest całkowicie rozsądnym (i prawdopodobnie nieco bardziej wydajnym) podejściem. Osobiście wolę to.źródło
>>
, dzięki za wskazanie tego! Poza tym przegapiłem kroksu SomeUser
po podłączeniu przez ssh.bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/foo
nie zostanie obcięte! (nawet z2>&1 |tee /tmp/foo
) tym, co jest idealne do logowania, i będzie działać idealnie po zmianie tego wszystkiego na>&2
. Sądzę więc, że tylko bezpośrednie użycie pliku/dev/stderr
pozwala na obcinanie, a nie duplikat deskryptora, fajne dzięki!Przypadki niepowodzenia występują, ponieważ składnia bash do użycia
&
w przekierowaniach określa pojedynczą>
i wymaga, aby istniała bezpośrednio przy&
znaku:źródło
Służy
'>'
do przekierowywania (obcina, jeśli istnieje) lub'>>'
(dołącza, jeśli istnieje).Służy
'>&'
do powielania strumienia, na przykład jeśli chcesz standardowego wyjścia ORAZ standardowego błędu w tym samym pliku, przekierowujesz do pliku,'> output.log'
a także błąd z'2>&'
źródło