Po prostu szukam różnicy między
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
i ich przenoszenie z non-Bourne shells
niczym tcsh
, mksh
itp
Po prostu szukam różnicy między
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
i ich przenoszenie z non-Bourne shells
niczym tcsh
, mksh
itp
&>
kompatybilność bash GNU, zdecydowanie zaleca się, aby tego nie używać, ponieważ parsowanie może przerwać semantykę istniejących skryptów POSIX, a mksh wyłącza to już w trybie POSIX.^ /dev/null
co to robi?Odpowiedzi:
Na tle:
Najpierw zajmiemy się ich funkcją. Więcej informacji można znaleźć w przewodniku Advanced Bash-Scripting Guide .
Funkcje
2>&-
Ogólna postać tego jest taka
M>&-
, gdzie „M” jest numerem deskryptora pliku. Spowoduje to zamknięcie danych wyjściowych dla dowolnego odwołania do deskryptora pliku, tj. „M” .2>/dev/null
Ogólna postać tego jest taka
M>/dev/null
, gdzie „M” jest numerem deskryptora pliku. Spowoduje to przekierowanie deskryptora pliku „M” do/dev/null
.2>&1
Ogólna forma tego jest taka
M>&N
, w której „M” i „N” są numerami deskryptorów plików. Łączy dane wyjściowe deskryptorów plików „M” i „N” w jednym strumieniu.|&
To tylko skrót
2>&1 |
. Został dodany w Bash 4.&>/dev/null
To tylko skrót
>/dev/null 2>&1
. Przekierowuje deskryptor pliku 2 (STDERR) i deskryptor 1 (STDOUT) do/dev/null
.>/dev/null
To tylko skrót
1>/dev/null
. Przekierowuje deskryptor pliku 1 (STDOUT) do/dev/null
.Przenośność do non-bash, tcsh, mksh itp.
Nie miałem wiele do czynienia z innymi pociskami poza
csh
itcsh
. Moje doświadczenie z tymi 2 w porównaniu do operatorów przekierowujących bash jest takie, że bash jest pod tym względem lepszy. Zobacz stronę manuala tcsh, aby uzyskać więcej informacji.Z poleceń, o które pytałeś, żadne nie jest bezpośrednio obsługiwane przez csh / tcsh. Będziesz musiał użyć różnych składni, aby zbudować podobne funkcje.
źródło
2>&-
vs2>/dev/null
(poza tym, że niektóre „źle” napisane programy nie rozumieją2>&-
poprawnie)?&>
byłbash
od samego początku (i łamie kompatybilność z Bourne i POSIX, ponieważ oznacza to coś innego, ale raczej nie zostanie trafiony).>&
i|&
pochodzą z(t)csh
(i to ich jedyny sposób na przekierowanie stderr). Byłyzsh
od początku i zostały dodane dopiero niedawnobash
. Zobacz takżerc
dla lepiej zaprojektowanych operatorów.(+2-2=0)
. Teraz, w części dotyczącej edycji, nie edytuję dużo, ale w tym przypadku zrobiłbym to, ponieważ wyjaśnia, że dane po operacji będą naN
. Przeczytałem, jak odpowiadasz, i jest bardzo w porządku pod każdym względem. Właśnie ta mała dwuznaczność skłoniła mnie do myślenia, dlatego właśnie wydanie. Ale ok, możesz dodać lub odrzucić, jak chcesz. Mam nadzieję, że mógłbym wyjaśnić tę kwestię. Tak trzymaj.Ma to na celu przekierowanie STDERR i STDOUT:
2>/dev/null
Przekieruj STDERR do / dev / null (zapobiegaj wyświetlaniu się na konsoli)
|&
Przekieruj STDERR i STDOUT do STDIN polecenia piped (cmd1 | & cmd2)
&>/dev/null
Przekieruj STDERR i STDOUT do / dev / null (nic nie pojawia się na konsoli)
>/dev/null
Przekieruj STDOUT na / dev / null (tylko STDERR pokazuje się na konsoli)
2>&-
Służy do zamykania deskryptora pliku używanego z przekierowaniem
Są to wszystkie standardowe metody przekierowania dla powłok Bourne'a.
źródło
|&
i nie&>/dev/null
są przenośne.Uznaj to za uzupełnienie do wybranej odpowiedzi. Możesz wiedzieć, które formularze są POSIX, a które nie.
W grę wchodzą dwa formularze POSIX:
-
W związku z tym:
Ostatni wiersz nie znajduje się w pierwotnym pytaniu, ale działa bez zarzutu w bash. (Działa również z / dev / tty podstawiony na / dev / null).
źródło