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, gedit
pojawia 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) itcsh
(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ż niegedit
pojawia 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/null
jest to interpretowane, >&/dev/null
ale dlaczego przestrzeń nie powoduje błędu w tych powłokach?
źródło
dash
.nohup command
Uruchom niezależny tty Twój application.According do mojej pamięci,dash
rozszerzonąash
,Debian ash
,ash
opracowane przezOpenBSD
i jest ograniczona powłoki, nawet Maemo OS (baza Debiana na N900 mobile) wykorzystuje kreskę,ash
powłoka rodzina mają ograniczone wykorzystanie spodziewać bash lub tcsh.dash
do wydrukowania jego wersji, ale pakiet jest0.5.7-3
, jaki jest twój? Czy jesteś pewien, że biegnieszdash
? To jest domyślne ustawienie Ubuntu,sh
prawda?nohup
robi, moje pytanie brzmi: dlaczego>&
wydaje się, że działa w pojedynczych muszlach z nohup?Odpowiedzi:
jest składnią POSIX i jest taki sam jak:
To jest uruchamiane
nohup gedit
w tle, a następnie wykonaj> /dev/null
przekierowanie bez uruchamiania polecenia.nie jest składnią POSIX i jest
csh
sposobem na przekierowanie zarówno stdout, jak i stderr do / dev / null.csh
nie ma2>&1
operatora takiego jak w Bourne, więc jest to jedyny sposóbcsh
, aby przekierować stderr.zsh
(jak często) zapewnia równieżcsh
składnię, ale obsługuje również operatorax>&y
duplikacji fd powłoki Bourne'a, co oznacza, że istnieje konflikt.przekierowuje
ls
stdout i stderr dofile
, ale jeśli plik jest2
, masz problem zoznacza przekierowanie standardowego wyjścia do zasobu wskazanego przez fd 2 (
dup(2, 1)
). Musisz to napisać:jeśli chcesz przekierować zarówno stdout, jak i stderr
ls
do pliku wywoływanego2
w bieżącym katalogu; lub użyj standardowej składni.bash
począ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
).ksh
skopiował tego operatora w ksh93t + w 2009 r., mksh w R35 w 2008 r. (wyłączony wposix
trybie), ale nie>&
.bash
dodano obsługę>&
w 2.05.busybox
sh
dodał 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
źródło
POSIX/Bourne
„Bourne”?