Czy istnieje standardowe narzędzie Bash, które działa jak echo, ale wysyła sygnał do stderr zamiast stdout?
Wiem, że mogę to zrobić, echo foo 1>&2
ale jest to trochę brzydkie i, jak podejrzewam, podatne na błędy (np. Bardziej prawdopodobne, że zostaną źle zmienione, gdy coś się zmieni).
Odpowiedzi:
Możesz to zrobić, co ułatwia czytanie:
>&2
kopiuje deskryptor pliku # 2 do deskryptora pliku # 1. Dlatego po wykonaniu tego przekierowania oba deskryptory plików będą odnosić się do tego samego pliku: pierwotnie odnosiło się do deskryptora jednego pliku # 2 . Więcej informacji można znaleźć w samouczku ilustrowanym przekierowaniu hakerów Bash .źródło
alias
skryptu powłoki. Byłoby to prawdopodobnie bezpieczniejsze w użyciuerrcho(){ >&2 echo $@; }
errcho(){ >&2 echo $@|pr -To5;}
nie będzie działać. Aby zrobić coś takiego, musisz umieścić przekierowanie gdzieś po ostatniej rurze, na przykład:errcho(){ echo $@|>&2 pr -To5;}
Możesz zdefiniować funkcję:
Byłoby to szybsze niż skrypt i nie miałyby żadnych zależności.
Sugestia specyficzna dla bash Camilo Martina używa „tutaj ciągu” i wypisze wszystko, co do niej przekażesz, w tym argumenty (-n), które echo normalnie przełknie:
Rozwiązanie Glenna Jackmana pozwala również uniknąć problemu z połykaniem argumentów:
źródło
echoerr -ne xt
nie wypisze „-ne xt”. Lepsze wykorzystanieprintf
do tego.echoerr() { cat <<< "$@" 1>&2; }
printf "%s\n" "$*" >&2
$IFS
białych znaków jest wysyłane jako osobny argument, co w przypadkuecho
oznacza połączenie ich z literą0x20
s, ale niebezpieczeństwa związane z niedocenianiem wygody o 2 mniej znaków do pisania) .Ponieważ
1
jest to standardowe wyjście, nie musisz jawnie nadawać mu nazwy przed przekierowaniem wyjścia,>
ale możesz po prostu wpisać:Ponieważ wydajesz się martwić, że
1>&2
trudno będzie Ci rzetelnie pisać, eliminacja zbędnych1
może być dla ciebie niewielką zachętą!źródło
Inna opcja
źródło
foo
- ma przekierowane własne stderr - np.foo >foo.log 2>&1
- wówczasecho foo >/dev/stderr
zablokuje wszystkie dane wyjściowe przed nią.>>
zamiast tego należy użyć:echo foo >>/dev/stderr
/dev/fd/2
./proc/self/fd/2
. Zobacz moją odpowiedź poniżej :)Nie, to standardowy sposób na zrobienie tego. Nie powinno to powodować błędów.
źródło
1>&2
. Wszyscy chcielibyśmy, żeby tak się nie stało, ale jestem pewien, że wszyscy byliśmy miejscami, w których tak się dzieje.( echo something 1>&2 ; something else ) > log
->(echo something; cp some junk 1>&2 ; something else) > log
Ups.Jeśli nie masz nic przeciwko rejestrowaniu wiadomości również w syslog, nie not_so_ugly sposób to:
Opcja -s oznacza: „Wyświetlaj komunikat o błędzie standardowym, a także w dzienniku systemowym”.
źródło
Jest to prosta funkcja STDERR, która przekierowuje wejście potoku do STDERR.
źródło
echo what | /dev/stderr
...Uwaga: odpowiadam na pytanie, a nie na mylące / niejasne echo „wyjściowe do stderr” (na które już odpowiedział OP).
Użyj funkcji, aby pokazać zamiar i źródło pożądanej implementacji. Na przykład
I
error_handling
będąc:Powody, które uwzględniają obawy w PO:
Inne powody:
źródło
Moja sugestia:
lub
echo "my errz" > /proc/self/fd/2
będzie skutecznie wyjście dostderr
ponieważ/proc/self
jest link do bieżącego procesu, a/proc/self/fd
trzyma procesu otwarte deskryptory plików, a następnie0
,1
i2
stanąć nastdin
,stdout
istderr
odpowiednio./proc/self
Link nie działa na MacOS, jednak/proc/self/fd/*
jest dostępny na Termux na Androidzie, ale nie/dev/stderr
. Jak wykryć system operacyjny ze skryptu Bash? może pomóc, jeśli chcesz uczynić skrypt bardziej przenośnym, określając, którego wariantu użyć.źródło
/proc/self
Link nie działa na MacOS, więc będę trzymać się bardziej prosta/dev/stderr
metoda. Ponadto, jak zauważono w innych odpowiedziach / komentarzach, prawdopodobnie lepiej jest użyć>>
do dołączenia./proc/self/fd/*
jest dostępny w Termux na Androida, ale nie/dev/stderr
.Nie używaj,
cat
ponieważ niektóre są tutaj wymienione.cat
to program, podczasecho
iprintf
są atakujących (Shell) builtins. Uruchomienie programu lub innego skryptu (również wspomnianego powyżej) oznacza utworzenie nowego procesu ze wszystkimi jego kosztami. Korzystanie z wbudowanych funkcji pisania jest dość tanie, ponieważ nie ma potrzeby tworzenia (wykonywania) procesu (środowiska).Opner pyta „czy jest jakieś standardowe narzędzie do wyprowadzania ( rury ) do stderr”, odpowiedź Schorta brzmi: NIE… dlaczego? ... przeprojektowane potoki to elementarna koncepcja w systemach takich jak unix (Linux ...) i bash (sh) bazuje na tych koncepcjach.
Zgadzam się z otwieraczem, że przekierowywanie za pomocą takich notacji:
&2>1
nie jest zbyt przyjemne dla współczesnych programistów, ale to bzdura. Bash nie był przeznaczony do pisania dużych i solidnych programów, ma na celu pomóc administratorom w pracy przy mniejszej liczbie naciśnięć klawiszy ;-)Przynajmniej możesz umieścić przekierowanie w dowolnym miejscu linii:
źródło
cat
a poleceniem komuś, żeby nie używał kota, ponieważ jest wolny. Istnieją niezliczone przypadki użycia, w których kot jest właściwym wyborem, dlatego sprzeciwiam się twojej odpowiedzi.echo
wymianę. Nawet jeśli użyjecat
, musi użyć przekierowania bash. tak czy siak. Dlatego nie ma absolutnie żadnego sensu, abycat
tutaj korzystać . BTW Używamcat
100 razy dziennie, ale nigdy w kontekście, o który prosi otwieracz ... rozumiesz?Inną opcją, na którą ostatnio natknąłem jest:
Wykorzystuje tylko wbudowane Bash, jednocześnie zmniejszając ryzyko wystąpienia błędów wieloliniowych (ponieważ nie trzeba pamiętać o dodawaniu
&>2
do każdej linii).źródło
cat
ani żadnego innego narzędzia, co jest nie na temat pytania.read
to wbudowane polecenie powłoki, które drukuje na stderr i może być używane jak echo bez wykonywania sztuczek przekierowania:-t 0.1
Jest limit czasu, który wyłącza czytać Głównego funkcjonalność przechowywania jeden wiersz standardowego wejścia do zmiennej.źródło
Stwórz skrypt
to byłoby twoje narzędzie.
Lub utwórz funkcję, jeśli nie chcesz mieć skryptu w osobnym pliku.
źródło
Mac OS X: Wypróbowałem zaakceptowaną odpowiedź i kilka innych odpowiedzi, a wszystkie z nich spowodowały napisanie STDOUT, a nie STDERR na moim komputerze Mac.
Oto przenośny sposób zapisu standardowego błędu za pomocą Perla:
źródło