Jawaban:
&
Operator trailing di akhir perintah digunakan untuk menempatkan perintah ke latar belakang. Ini sebenarnya sintaks standar yang ditentukan oleh standar POSIX :
Daftar Asinkron
Jika perintah diakhiri oleh operator kontrol ('&'), shell harus menjalankan perintah secara tidak sinkron dalam sebuah subkulit. Ini berarti bahwa shell tidak akan menunggu perintah selesai sebelum menjalankan perintah berikutnya.
Format untuk menjalankan perintah di latar belakang adalah:
command1 & [command2 & ...]
Tujuan dari latar belakang perintah adalah untuk menjalankan perintah tanpa shell utama dalam skrip atau shell interaktif menunggu perintah, yang akan memblokir eksekusi perintah lain dan membuat ketidaknyamanan bagi pengguna untuk menunggu. Ini berguna untuk memulai perintah yang sudah berjalan lama tetapi Anda harus terus bekerja di shell saat ini. Seperti yang bisa Anda tebak, ini berasal dari waktu di mana tidak ada emulator terminal multi-tab, tetapi terminal sebenarnya adalah perangkat keras fisik yang terhubung ke komputer itu sendiri.
Dari definisi yang Anda lihat itu &
juga berfungsi sebagai terminator perintah untuk daftar perintah, seperti ;
halnya. Dalam contoh spesifik Anda, pyprogramm >> /dev/null 2>&1 &
hanya ada satu perintah dalam daftar.
Lebih umum,
echo Hello ; echo World ;
dan
echo Hello & echo World &
adalah dua contoh daftar yang diakhiri oleh ;
dan &
operator. Satu perbedaan adalah &
daftar yang diakhiri akan memiliki input yang terhubung /dev/null
jika kontrol pekerjaan dinonaktifkan:
Jika kontrol pekerjaan dinonaktifkan (lihat set, -m), input standar untuk daftar asinkron, sebelum pengalihan eksplisit dilakukan, harus dianggap ditugaskan ke file yang memiliki properti yang sama dengan / dev / null. Ini tidak akan terjadi jika kontrol pekerjaan diaktifkan. Dalam semua kasus, pengalihan eksplisit input standar harus mengesampingkan aktivitas ini.
Namun, dalam daftar berurutan, setiap perintah masih stdin
terhubung ke terminal jika tidak ada pengalihan eksplisit.
Perhatikan juga, bahwa dari definisi yang kami sebutkan sebelumnya, &
menjalankan perintah dalam subkulit. Sebaliknya, ;
daftar terminasi dijalankan dalam shell saat ini. Ada juga perbedaan dalam status keluar. Untuk &
standar mengatakan:
Status keluar dari daftar asinkron harus nol.
Ini penting ketika Anda ingin menempatkan beberapa perintah di latar belakang. Saat Anda menulis skrip atau perintah, Anda harus memilih perintah yang tidak Anda pedulikan jika gagal atau tidak, atau Anda harus menemukan cara untuk menangani status keluar yang bukan nol (kesalahan). Dalam contoh spesifik Anda, pyprogramm >> /dev/null 2>&1 &
menjalankan di latar belakang harus memiliki beberapa cara untuk menunjukkan apakah gagal atau tidak, namun menilai bahwa Anda menggunakan 2>&1
Anda menyembunyikan output kesalahan dengan mengarahkan, dan Anda mungkin menganggap skrip tidak boleh gagal.
Sebaliknya, ;
status keluar didefinisikan sebagai:
Status keluar dari daftar berurutan harus menjadi status keluar dari perintah terakhir dalam daftar.
Sekali lagi, ini memiliki implikasi pada bagaimana Anda menulis daftar perintah berurutan di baris perintah dan bagaimana Anda ingin hal-hal ditangani jika beberapa perintah dalam daftar gagal.
Fakta bahwa ini adalah POSIX definisi berarti bahwa semua Bourne-seperti kerang, makna bash
, dash
dan ksh
harus mendukung itu.
&
dalam pengalihan berbeda dari &
sebagai terminator perintah. Ini berarti menduplikasi (menyalin) objek file-deskriptor. Lihat Apa maksud & tepatnya dalam pengalihan output?
Di bash
sana juga ada |&
operator (perhatikan tidak ada ruang antara pipa dan ampersand). Dari manual bash :
Jika | & digunakan, kesalahan standar perintah, selain output standarnya, terhubung ke input standar command2 melalui pipa; itu adalah singkatan untuk 2> & 1 |. Pengalihan implisit kesalahan standar ke output standar dilakukan setelah setiap pengalihan ditentukan oleh perintah.
Itu berarti menjalankan perintah di latar belakang. Script panggilan berlanjut daripada memblokir sampai perintah yang dipanggil selesai.
&
menyembunyikan keluaran tidak terdengar benar. Paragraf dari standar yang Anda kutip berbicara tentang input , bukan output . Alasan untuk perbedaan antara kontrol pekerjaan yang diaktifkan atau tidak adalah bahwa proses latar belakang yang mencoba membaca dari tty akan ditangguhkan. Pada titik itu Anda perlu menggunakan kontrol pekerjaan untuk meletakkannya di latar depan untuk memberikan input yang ditunggu. Semua itu tidak dapat dilakukan tanpa kontrol pekerjaan dan dengan demikian jika kontrol pekerjaan dinonaktifkan, stdin perlu diarahkan ulang/dev/null
atau setara.