Jeśli chodzi o powłokę bash, najlepszym sposobem na zapamiętanie jest zrozumienie tego, co się dzieje.
Jeśli wszystko, co chcesz zrobić, to pamiętać, jak poprawnie wykonać polecenie, możesz spróbować
program > /results 2> /results
To miłe i oczywiste, co się dzieje i łatwe do zapamiętania. to znaczy
1
STDOUT zamierza /results
2
STDERR również idzie bezpośrednio do/results
problem polega na tym, że to nie działa tak, jak można się spodziewać. rozważ następujące:
plik: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
i uruchom polecenie
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
następnie
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
Co tu się stało?
Rozumiem, że bash konfiguruje przekierowanie kierujące STDERR bezpośrednio do pliku /tmp/results
i ze względu na naturę, >
która robi 2 rzeczy
- zwykle tworzy nowy plik - w tym przypadku okazja minęła, ponieważ bash przeszedł obok tej procedury w momencie generowania danych wyjściowych.
- wstaw prosto na początek pliku. i nie dołączaj tak jak
>>
robi.
Tak więc w tym przypadku STDERR, wstawia bezpośrednio na początku /tmp/results
przesłaniania wyjścia STDOUT.
Uwaga: jeśli >>
używałeś dołączania, prawdopodobnie mógłbyś uniknąć tej składni.
Jednak, aby rozwiązać problem, którego potrzebujesz - nie przekierowywać STDERR - bezpośrednio do pliku, ale raczej połączyć dane wyjściowe STDERR ze strumieniem STDOUT, aby uniknąć kolizji.
Korzystanie z operatora 2>&1
operatora osiąga to
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
&
Umożliwia bash do odróżnienia od pliku o nazwie 1
i 1
deskryptora pliku.
Dla mnie 2>&1
samo stwierdzenie dokładnie wyjaśnia, co się dzieje - STDERR jest przekierowywany do samego STDOUT - i kończy się na tym, /tmp/results
ponieważ właśnie tam jest wskazany STDOUT (prawie jako efekt uboczny).
W przeciwieństwie do tego, co twierdzą wiele przewodników, 2>&1
wysyła STDERR tam, gdzie jest zawsze wskazywany STDOUT. Gdyby tak było - nadal występowałby problem z nadpisywaniem.
Aby uzyskać więcej informacji, zobacz - http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
program 1> /dev/null 2>/dev/null
. Czasami jednak trzeba wymieszaćstdout
istderr
razem, aby zobaczyć, co się naprawdę dzieje - na przykład przekierowanie wyjścia do złożonego procesu kompilacji do pliku. W takim razie