Nie do końca rozumiem, jak komputer odczytuje to polecenie.
cat file1 file2 1> file.txt 2>&1
Jeśli rozumiem, 2>&1
po prostu przekieruj Standard Error na Standard Output.
Zgodnie z tą logiką polecenie brzmi następująco:
łącz pliki
file1
ifile2
.wyślij
stdout
z tej operacji dofile.txt
.wysłać
stderr
dostdout
.koniec?
Nie jestem pewien, co robi komputer. Według mojej logiki polecenie powinno być
cat file1 file2 2>&1 > file.txt
ale to nie jest poprawne.
bash
shell
command-line
io-redirection
file-descriptors
iDontKnowBetter
źródło
źródło
$
skrót?var=$othervar
,$
wprowadza nazwę zmiennej po prawej stronie. W przekierowania jak2>&1
,&
wprowadza numer deskryptora pliku na prawej stronie. Mówię, że możesz myśleć o tym jak o „plik 2 równa się plik 1”. (Istnieją jednak dwa rodzaje równości:<
oznacza „do czytania” i>
oznacza „do pisania”.)Kolejność przekierowań jest ważna i należy je czytać od lewej do prawej .
Na przykład:
command 2>&1 >somefile
oznacza:stderr
(mianowicie2
) do bieżącego miejsca docelowegostdout
(w tym momencie terminalu).stdout
aby przejść dosomefile
.Więc w tym przypadku
stderr
idzie do terminala istdout
przechodzi do pliku, który prawdopodobnie nie jest tym, czego prawdopodobnie chcesz.Z drugiej strony
command >somefile 2>&1
oznacza:stdout
dosomefile
stderr
do tego samego miejsca docelowego costdout
(somefile
).W tym ostatnim przypadku zarówno
stderr
istdout
przejdź dosomefile
, co prawdopodobnie jest tym, czego chcesz.źródło
>&
W rzeczywistości oznacza duplikat, używa wywołania systemowego dup do mapowania nowego deskryptora pliku na już otwarty plik.Więc (bash) najpierw musisz otworzyć nowy stdout, mówiąc „i przekieruj stderr na dowolne ustawione stdout”.
źródło
&
. czy mógłbyś załączyć kilka odniesień do tej składni, lub - jeszcze lepiej - jakieś dobre zasoby we wspomnianym systemie dup?