Najwyraźniej nie znam wszystkich docelowych miejsc docelowych, które są dostępne do użycia. Wiem o stdout
( &1
) i stderr
( &2
). Jednak po przekierowanie zarówno deskryptory, czasami jeszcze trochę wyjście w moim konsoli!
Najprostszym przykładem, jaki mogę wymyślić, jest GNU Parallel; Za każdym razem, gdy go używam, widzę zawiadomienie o cytowaniu. Nawet gdy to robię &2>1 > file
, nadal widzę to powiadomienie.
To samo dotyczy emerge
: kiedy uruchamiam się i pojawiają się pewne problemy, niektóre informacje nie są drukowane stdout
ani stdin
, ponieważ przekierowuję je, a one nadal przechodzą.
Najczęściej rozwiązuję te problemy za pomocą script
, ale wciąż zastanawiam się, co jest przyczyną tego problemu.
bash
terminal
io-redirection
MatthewRock
źródło
źródło
/dev/tty
.parallel
:mkdir ~/.parallel; touch ~/.parallel/will-cite
wyłączy irytującą wiadomość. Alternatywnie, rozejrzyj się za innymi implementacjamiparallel
.parallel
jako przykładu.Odpowiedzi:
Użyta składnia jest nieprawidłowa.
zostanie podzielony jako
Spowoduje to:
cmd
jako zadanie w tle bez przekierowaństderr
do pliku dosłownie wywołanego1
i przekierowaniestdout
dofile
Żądana składnia to:
Kolejność operacji jest ważna. Spowoduje to:
stdout
dofile
stderr
do&1
- tzn. Ten sam uchwyt pliku, costdout
Powoduje to, że zarówno
stderr
istdout
zostanie przekierowanyfile
.W
bash
prostsza niestandardowa (i dlatego nie polecam, ze względu na przenośność) składniacmd &> file
robi to samo.źródło
/dev/tty
, ale mam nadzieję, że nie zdarza się to zbyt często (jeśli w ogóle).at
polecenie na swoim komputerze i masz uprawnienia do korzystania z niego, możesz je uruchomić za pośrednictwemat now
. Szczegółowe informacje można znaleźć na stronie podręcznika. Spowoduje to uruchomienie polecenia za pomocą mechanizmu procesu wsadowego, a proces nigdy nie będzie miał tty do zapisu. Ale generalnie nie martwiłbym się tym przypadkiem. Zazwyczaj wykorzystywane są tylko procesy wymagające interakcji i umyślne wyświetlanie informacji użytkownikom, mimo przekierowania/dev/tty
.Istnieją dwa problemy.
Pierwszym jest to, że kolejność ma znaczenie, drugim jest
/dev/tty
.Użyjmy tego skryptu jako przykładowego skryptu, z którego chcemy przechwycić dane wyjściowe:
test.sh
:Zobaczmy teraz wyniki poleceń:
./testmyscript.sh 2>&1 >/dev/null
:Ponieważ kolejność obliczeń jest od lewej do prawej, najpierw otrzymujemy „przekierowanie
stderr
do dowolnego miejscastdout
wyjściowego (czyli wyjścia konsoli)”. Następnie otrzymujemy „przekierowaniestdout
do/dev/null
. Sytuacja wygląda następująco:stdout
->/dev/null
stderr
-> konsolaWięc dobrze to rozumiemy:
./testmyscript.sh >/dev/null 2>&1
I otrzymujemy:
ttdada
.Teraz wykonujemy „Przekieruj
stdout
do/dev/null
”, a następnie „Przekieruj stderr do miejsca, w którym wskazuje stdout” (więc,/dev/null
). Hurra!Nadal jednak mamy problem; program drukuje do
/dev/tty
. Teraz nie wiem, jak naprawić tego rodzaju zachowanie, więc najprawdopodobniej będziesz go potrzebowaćscript
, ale mam nadzieję, że takie zachowanie nie zdarzy się zbyt często.źródło