Saya mengedit jawaban pada Ask Ubuntu yang menyarankan yang berikut ini
nohup gedit >& /dev/null &
Padahal sebenarnya maksud mereka
nohup gedit &> /dev/null &
Yang terakhir benar mengarahkan kedua stderr dan stdout ke /dev/null
. Saya mengharapkan yang pertama untuk membuat file bernama &
atau, lebih mungkin, untuk memberikan kesalahan seperti halnya untuk kasus lain:
$ echo "foo" >&
bash: syntax error near unexpected token `newline'
Alih-alih, tampaknya berfungsi dengan cara yang persis sama seperti yang pertama, sebuah gedit
jendela muncul dan tidak ada pesan kesalahan yang dicetak.
Saya juga harus mencatat bahwa ini khusus untuk shell:
bash
(4.2.45 (1) -release),zsh
(5.0.2),csh
(versi paket deb: 20110502-2) dantcsh
(6.18.01): berfungsi seperti dijelaskan di atas, tidak ada pesan kesalahan, tidak ada file yang dibuat.dash
(0.5.7-3):$ nohup gedit >& /dev/null & $ dash: 2: Syntax error: Bad fd number
ksh
(93u + 2012-08-01): gagal, tetapi suatu proses tampaknya dimulai (1223
) meskipun tidak adagedit
jendela yang muncul:$ 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 & ^
Jadi, mengapa perintah ini hanya berjalan tanpa kesalahan (dan tidak ada file output yang dibuat) di beberapa shell dan gagal di yang lain? Apa yang >&
dilakukan dalam kasus khusus yang tampaknya nohup
? Saya menduga itu >& /dev/null
ditafsirkan sebagai >&/dev/null
tetapi mengapa ruang tidak menyebabkan kesalahan pada shell ini?
sumber
dash
.nohup command
, Menjalankan tty independen application.According ke memori saya,dash
diperpanjang dariash
,Debian ash
,ash
yang dikembangkan olehOpenBSD
dan itu shell terbatas, bahkan maemo OS (Debian Berdasarkan n900 mobile) menggunakan dasbor,ash
shell keluarga memiliki penggunaan yang terbatas diharapkan dari bash atau Tcsh.dash
untuk mencetak versinya tetapi paketnya adalah0.5.7-3
, apa milik Anda? Juga, apakah Anda yakin sedang berlaridash
? Itu standar Ubuntush
bukan?nohup
, pertanyaan saya adalah mengapa>&
tampaknya bekerja dengan nohup sendirian di beberapa shell.Jawaban:
adalah sintaks POSIX dan sama dengan:
Itu dijalankan
nohup gedit
di latar belakang dan kemudian lakukan> /dev/null
pengalihan tanpa menjalankan perintah.bukan sintaks POSIX dan merupakan
csh
cara untuk mengarahkan ulang stdout dan stderr ke / dev / null.csh
tidak memiliki2>&1
operator seperti yang ditemukan di Bourne, jadi itu satu-satunya caracsh
untuk mengarahkan ulang stderr.zsh
(Seperti sering) juga memberikancsh
sintaks, tetapi juga mendukung operatorx>&y
duplikasi fd dari shell Bourne, yang berarti ada konflik di sana.pengalihan
ls
stdout dan stderr kefile
, tetapi jika file tersebut2
, Anda punya masalah sebagaiberarti mengarahkan ulang stdout ke sumber yang ditunjukkan oleh fd 2 (
dup(2, 1)
). Jadi, Anda perlu menulisnya:jika Anda ingin mengarahkan kembali stdout dan stderr
ls
ke file yang disebut2
di direktori saat ini; atau gunakan sintaks standar.bash
awalnya tidak mengerti>&
, tetapi justru memperkenalkan&>
operator untuk itu, melanggar kepatuhan POSIX dalam prosesnya (meskipun kemungkinan skrip tidak akan digunakancmd &> xxx
).ksh
menyalin operator itu di ksh93t + pada 2009, mksh di R35 pada 2008 (dinonaktifkan dalamposix
mode) tetapi tidak>&
.bash
menambahkan dukungan untuk>&
pada 2.05.busybox
sh
menambahkan dukungan untuk keduanya&>
dan>&
di 1.13 (2008).Baik
>&
atau&>
sebagai makna redirect stdout dan stderr adalah POSIX / Bourne.Jika Anda ingin mengarahkan ulang stdout dan stderr portable, sintaksnya adalah
sumber
POSIX/Bourne
oleh "Bourne"?