Dlaczego „nohup command> & / dev / null” wydaje się „działać” w niektórych powłokach?


12

Zredagowałem odpowiedź na Ask Ubuntu, która sugerowała, co następuje

nohup gedit >& /dev/null & 

Kiedy tak naprawdę mieli na myśli

nohup gedit &> /dev/null & 

Ten drugi poprawnie przekierowuje zarówno stderr, jak i stdout do /dev/null. Spodziewałem się, że ten pierwszy utworzy plik o nazwie &lub, co bardziej prawdopodobne, spowoduje błąd, tak jak w innych przypadkach:

$ echo "foo" >& 
bash: syntax error near unexpected token `newline'

Zamiast tego wydaje się, że działa dokładnie tak samo jak poprzedni, geditpojawia się okno i nie jest drukowany komunikat o błędzie.

Powinienem również zauważyć, że jest to specyficzne dla powłoki:

  • bash(4.2.45 (1) -release), zsh(5.0.2), csh(wersja pakietu deb: 20110502-2) i tcsh(6.18.01): działa jak opisano powyżej, bez komunikatu o błędzie, nie utworzono plików.

  • dash (0,5.7-3):

    $ nohup gedit >& /dev/null & 
    $ dash: 2: Syntax error: Bad fd number
    
  • ksh(93u + 2012-08-01): kończy się niepowodzeniem, ale proces najwyraźniej się rozpoczyna ( 1223), chociaż nie geditpojawia się żadne okno:

    $ nohup gedit >& /dev/null & 
    [1] 1223
    $ ksh: /dev/null: bad file unit number
    
  • fish (2.0.0):

    > nohup gedit >& /dev/null & 
    fish: Requested redirection to something that is not a file descriptor /dev/null
    nohup gedit >& /dev/null & 
                   ^
    

Dlaczego więc to polecenie po prostu działa bez błędów (i nie jest tworzony plik wyjściowy) w niektórych powłokach, aw innych nie działa? Co >&robi w pozornie szczególnym przypadku nohup? Zgaduję, że >& /dev/nulljest to interpretowane, >&/dev/nullale dlaczego przestrzeń nie powoduje błędu w tych powłokach?


Na moim komputerze, Ubuntu 12.04, to polecenie działa normalnie dla dash.
cuonglm

nohup commandUruchom niezależny tty Twój application.According do mojej pamięci, dashrozszerzoną ash, Debian ash, ashopracowane przez OpenBSDi jest ograniczona powłoki, nawet Maemo OS (baza Debiana na N900 mobile) wykorzystuje kreskę, ashpowłoka rodzina mają ograniczone wykorzystanie spodziewać bash lub tcsh.
PersianGulf

@Gnouc huh, może inna wersja (jestem na Debianie)? Nie mogę wymyślić, jak zmusić mnie dashdo wydrukowania jego wersji, ale pakiet jest 0.5.7-3, jaki jest twój? Czy jesteś pewien, że biegniesz dash? To jest domyślne ustawienie Ubuntu, shprawda?
terdon

@MohsenPahlevanzadeh Nie jestem pewien, o co ci chodzi, wiem, co nohuprobi, moje pytanie brzmi: dlaczego >&wydaje się, że działa w pojedynczych muszlach z nohup?
terdon

Możesz użyć poniższego linku do oglądania muszli: unix.stackexchange.com/questions/45684/…
PersianGulf

Odpowiedzi:


18
nohup gedit &> /dev/null

jest składnią POSIX i jest taki sam jak:

nohup gedit &
> /dev/null

To jest uruchamiane nohup geditw tle, a następnie wykonaj > /dev/nullprzekierowanie bez uruchamiania polecenia.

nohup gedit >& /dev/null

nie jest składnią POSIX i jest cshsposobem na przekierowanie zarówno stdout, jak i stderr do / dev / null. cshnie ma 2>&1operatora takiego jak w Bourne, więc jest to jedyny sposób csh, aby przekierować stderr.

zsh(jak często) zapewnia również cshskładnię, ale obsługuje również operatora x>&y duplikacji fd powłoki Bourne'a, co oznacza, że ​​istnieje konflikt.

ls >&file

przekierowuje lsstdout i stderr do file, ale jeśli plik jest 2, masz problem z

ls >&2

oznacza przekierowanie standardowego wyjścia do zasobu wskazanego przez fd 2 ( dup(2, 1)). Musisz to napisać:

ls >& ./2

jeśli chcesz przekierować zarówno stdout, jak i stderr lsdo pliku wywoływanego 2w bieżącym katalogu; lub użyj standardowej składni.

bashpoczątkowo nie rozumiał >&, ale &>zamiast tego wprowadził operatora, łamiąc zgodność z POSIX w tym procesie (choć jest mało prawdopodobne, aby skrypt go użył cmd &> xxx).

kshskopiował tego operatora w ksh93t + w 2009 r., mksh w R35 w 2008 r. (wyłączony w posixtrybie), ale nie >&.

bashdodano obsługę >&w 2.05.

busybox shdodał obsługę obu wersji &>i >&1.13 (2008).

Ani >&ani &>jako znacznik przekierowania stdout i stderr nie są POSIX / Bourne.

Jeśli chcesz przekierować przenośnie stdout i stderr, składnia jest następująca

cmd > file 2>&1

Masz na myśli Bash w POSIX/Bourne„Bourne”?
Pandya,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.