Mengapa 'nohup command> & / dev / null' tampaknya bekerja di beberapa shell?

12

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 geditjendela 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) dan tcsh(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 ada geditjendela 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/nullditafsirkan sebagai >&/dev/nulltetapi mengapa ruang tidak menyebabkan kesalahan pada shell ini?

terdon
sumber
Di mesin saya, Ubuntu 12.04, perintah ini berjalan normal untuk dash.
cuonglm
nohup command, Menjalankan tty independen application.According ke memori saya, dashdiperpanjang dari ash, Debian ash, ashyang dikembangkan oleh OpenBSDdan itu shell terbatas, bahkan maemo OS (Debian Berdasarkan n900 mobile) menggunakan dasbor, ashshell keluarga memiliki penggunaan yang terbatas diharapkan dari bash atau Tcsh.
PersianGulf
@ Gouc, ya, mungkin versi yang berbeda (saya menggunakan Debian)? Saya tidak tahu bagaimana cara mendapatkan saya dashuntuk mencetak versinya tetapi paketnya adalah 0.5.7-3, apa milik Anda? Juga, apakah Anda yakin sedang berlari dash? Itu standar Ubuntu shbukan?
terdon
@MohsenPahlevanzadeh Saya tidak yakin apa maksud Anda, saya tahu apa nohup, pertanyaan saya adalah mengapa >&tampaknya bekerja dengan nohup sendirian di beberapa shell.
terdon
Anda dapat menggunakan tautan berikut untuk melihat cangkang abstarct: unix.stackexchange.com/questions/45684/…
PersianGulf

Jawaban:

18
nohup gedit &> /dev/null

adalah sintaks POSIX dan sama dengan:

nohup gedit &
> /dev/null

Itu dijalankan nohup geditdi latar belakang dan kemudian lakukan > /dev/nullpengalihan tanpa menjalankan perintah.

nohup gedit >& /dev/null

bukan sintaks POSIX dan merupakan cshcara untuk mengarahkan ulang stdout dan stderr ke / dev / null. cshtidak memiliki 2>&1operator seperti yang ditemukan di Bourne, jadi itu satu-satunya cara cshuntuk mengarahkan ulang stderr.

zsh(Seperti sering) juga memberikan cshsintaks, tetapi juga mendukung operator x>&y duplikasi fd dari shell Bourne, yang berarti ada konflik di sana.

ls >&file

pengalihan lsstdout dan stderr ke file, tetapi jika file tersebut 2, Anda punya masalah sebagai

ls >&2

berarti mengarahkan ulang stdout ke sumber yang ditunjukkan oleh fd 2 ( dup(2, 1)). Jadi, Anda perlu menulisnya:

ls >& ./2

jika Anda ingin mengarahkan kembali stdout dan stderr lske file yang disebut 2di direktori saat ini; atau gunakan sintaks standar.

bashawalnya tidak mengerti >&, tetapi justru memperkenalkan &>operator untuk itu, melanggar kepatuhan POSIX dalam prosesnya (meskipun kemungkinan skrip tidak akan digunakan cmd &> xxx).

kshmenyalin operator itu di ksh93t + pada 2009, mksh di R35 pada 2008 (dinonaktifkan dalam posixmode) tetapi tidak >&.

bashmenambahkan dukungan untuk >&pada 2.05.

busybox shmenambahkan 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

cmd > file 2>&1
Stéphane Chazelas
sumber
Apakah maksud Anda Bash in POSIX/Bourneoleh "Bourne"?
Pandya