Odpowiedzi:
Oprócz odpowiedzi Martina, Asha i Kevina czasami zobaczysz znak ampersand używany matematycznie do bitowego AND * :
$ echo $(( 11 & 7 ))
3
Jeśli nie znasz operatorów bitów:
11: 1011
7: 0111
-------- AND
3: 0011
W każdej pozycji jest jeden bit w pierwszej liczbie ORAZ w drugiej liczbie, ustaw ten bit na jeden w odpowiedzi.
* Funkcja w odpowiedzi Kevina jest nazywana logicznym AND.
Aby rozwinąć odpowiedź Asha, w przypadku przekierowania znak ampersand może powiedzieć powłoce, aby skopiowała deskryptor pliku. W tym poleceniu echo "hello" > outputfile 2>&1
znak & powoduje, że każde wyjście, które może przejść do błędu standardowego (stderr, deskryptor pliku 2), przechodzi w to samo miejsce, co wyjście standardowe (stdout, deskryptor pliku 1, domyślny dla lewej strony >
). >& outputfile
Operatora jest skrótem > outputfile 2>&1
.
Ponadto, nowe w Basha 4, są dwie nowe terminatory klauzul case
polecenia ;&
i ;;&
które mają wpływ czy przypadek „spada przez” i, jeśli tak, to czy następnego testu.
>& filename
wypisuje stdout i stderr do tego samego pliku. Jeśli chcesz przekierować tylko stderr (i zostaw stdout w spokoju), zrobiłbyś to 2> filename
. Co do drugiego pytania, najprawdopodobniej użyłbyś obu nohup
i &
.
logout
lub exit
.
W skrypcie powłoki Bash ampersand „&” służy do rozwidlenia procesów:
find -name hello &
Spowoduje to rozwidlenie polecenia find i uruchomienie go w tle (zawsze możesz go zabić za pomocą jego PID).
Po co uruchamiać komendę powłoki systemu Linux za pomocą „&”?
Aby natychmiast otrzymać monit, i uruchom proces w tle.
Jakie są ich funkcje?
nohup pozwala procesowi działającemu w tle kontynuować działanie nawet po wylogowaniu użytkownika (lub wyjściu z powłoki inicjującej).
> & przekierowuje zarówno standardowe wyjście, jak i standardowy błąd do pliku dziennika.
i uruchamia wszystko w tle, natychmiast zwracając monit.
Wyjaśnienie:
Każdy proces Linuksa otwiera trzy kanały We / Wy, wejście „stdin”, standardowe wyjście „stdout” i standardowe wyjście błędu „stderr”. Można ich używać w formacie binarnym, ale tradycyjnie są to teksty. Kiedy większość programów widzi stdin close, wychodzą (może to zmienić programista).
Kiedy powłoka rodzicielska wychodzi, stdin jest zamykany na dzieci i (często, zwykle) dzieci również wychodzą. Ponadto dzieci otrzymują sygnał programowy, SIGHUP, wskazujący, że użytkownik „rozłączył się” (wcześniej modem), a domyślnym ustawieniem jest również wyjście. (Uwaga: programista może to wszystko zmienić podczas pisania programu).
Nohup daje więc procesowi potomnemu oddzielne środowisko we / wy, wiążąc wejścia i wyjścia z czymś niepowiązanym z powłoką nadrzędną i osłaniając dziecko przed sygnałem SIGHUP. Gdy użytkownik rozłączy się, zobaczysz proces w tle nohup należący do init (proces 1), a nie jego powłokę.
Jednak nohup
nie można wykonać zadania całkowicie, jeśli proces jest uruchamiany na pierwszym planie, dlatego &
służy do uruchamiania programu w tle, gdzie może on z radością pozostać uruchomiony z zalogowanym użytkownikiem lub bez niego.
Oprócz odpowiedzi @ Martina: Inne użycie znaku handlowego i ( >&
jak wyżej) polega na przechwytywaniu obu znaków stdout
i stderr
. Normalnie, jeśli przekierujesz dane wyjściowe do pliku zawierającego tylko „>”, otrzymasz tylko dane wyjściowe stdout
, bez żadnych błędów.
Oprócz odpowiedzi Martina i Asha czasami możesz zobaczyć użycie &&
tokena. Służy to do powiedzenia „uruchom drugie polecenie, jeśli i tylko jeśli pierwsze polecenie zakończyło się powodzeniem”. Dobrze napisane polecenie, jeśli zawiera jakieś błędy, nie zakończy się pomyślnie.
[kevin@box ~]$ ls file && echo removing file && rm file
ls: file: No such file or directory
[kevin@box ~]$ touch file
[kevin@box ~]$ ls file && echo removing file && rm file
file
removing file
[kevin@box ~]$
Odpowiedź Martina jest dobra, ale trochę niejednoznaczna. Polecenie jest zawsze rozwidlane i wykonywane, ale normalnym zachowaniem powłoki jest czekanie na polecenie, aż zakończy działanie. Znak ampersand umieszcza go w tle, dzięki czemu możesz ponownie wyświetlić monit terminala i możesz robić inne rzeczy. Jeśli proces wyrzuca dane na standardowe wyjście lub na standardowe wyjście, zostanie to zmieszane z tym, co robisz w wierszu poleceń, i może cię pomylić. Właśnie dlatego przekierowujesz za pomocą> & /path/to/logfile.txt.
W odpowiedzi na George2 normalnym zachowaniem wychodzącym z powłoki jest wysłanie sygnału SIGHUP do wszystkich procesów w tej samej grupie procesów (zasadniczo rzeczy, które spawnowałeś) i zwykle się kończą. Jeśli chcesz, aby trwało to nawet po zamknięciu procesu powłoki, możesz użyć polecenia nohup, aby zignorować ten sygnał i kontynuować działanie. Istnieje specjalna nazwa dla tego typu procesu, zwana procesem demona (wymawiane jako „demon”).