Apa arti dari & di akhir perintah?


12

Saya memiliki baris skrip startup:

pyprogramm >> /dev/null  2>&1 &

Arti:

>> /dev/null - redirect stdout to null device
2>&1 - redirect stderr to stdout (that is redirected to null device)

tapi apa arti yang terakhir &?

Jawaban:


16

Apa itu & terminator?

&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.

Sekuensial ; daftar vs asinkron & 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/nulljika 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 stdinterhubung 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>&1Anda 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.


Catatan samping dan bacaan tambahan

  • Fakta bahwa ini adalah POSIX definisi berarti bahwa semua Bourne-seperti kerang, makna bash, dashdan kshharus mendukung itu.

  • &dalam pengalihan berbeda dari &sebagai terminator perintah. Ini berarti menduplikasi (menyalin) objek file-deskriptor. Lihat Apa maksud & tepatnya dalam pengalihan output?

  • Di bashsana 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.


2
Apa yang Anda katakan tentang &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/nullatau setara.
kasperd

Saya melihat ada kesalahan dalam hasil edit Anda juga. Di satu tempat Anda menulis diaktifkan di mana Anda seharusnya menulis dinonaktifkan.
kasperd

@kasperd Ya, saya baru saja membaca kembali halaman POSIX ketika saya perhatikan itu juga. Sudah diperbaiki. Beri tahu saya jika ada yang perlu diedit. Terima kasih :)
Sergiy Kolodyazhnyy

3

Itu berarti menjalankan perintah di latar belakang. Script panggilan berlanjut daripada memblokir sampai perintah yang dipanggil selesai.


0

&ini mengembalikan kontrol skrip ke sistem operasi tetapi mengirim respons ke latar belakang tidak seperti nohupyang langsung mengirim seluruh eksekusi

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.