Saya tidak mengerti perintah bash exec
. Saya telah melihatnya digunakan di dalam skrip untuk mengarahkan semua output ke file (seperti yang terlihat dalam ini ). Tapi saya tidak mengerti cara kerjanya atau apa yang dilakukan secara umum. Saya telah membaca halaman manual tetapi saya tidak memahaminya.
107
exec
cara khusus yang bisa dijelaskan lebih sederhana, saya akan menulis jawaban.Jawaban:
man bash
mengatakan:Dua baris terakhir adalah yang penting: Jika Anda menjalankannya
exec
sendiri, tanpa perintah, itu hanya akan membuat pengalihan berlaku untuk shell saat ini. Anda mungkin tahu bahwa ketika Anda menjalankancommand > file
, output daricommand
ditulisfile
bukan ke terminal Anda (ini disebut redirection ). Jika Anda menjalankannyaexec > file
, maka pengalihan berlaku untuk seluruh shell: Setiap output yang dihasilkan oleh shell ditulis untukfile
bukannya ke terminal Anda. Sebagai contoh di siniSaya pertama kali memulai
bash
shell baru . Kemudian, di shell baru ini saya jalankanexec > file
, sehingga semua output dialihkan kefile
. Memang, setelah itu saya jalankandate
tetapi saya tidak mendapatkan output, karena output diarahkan kefile
. Kemudian saya keluar dari shell saya (sehingga pengalihan tidak lagi berlaku) dan saya melihat bahwafile
memang berisi output daridate
perintah yang saya jalankan sebelumnya.sumber
exec
berfungsi juga untuk menggantikan proses shell saat ini dengan perintah, sehingga orang tua berjalan dan anak memiliki pid. Ini bukan hanya untuk pengalihan. Silakan tambahkan info iniexec nginx <various nginx arguments>
. Ini berarti bahwa nginx mengambil alih pid dari skrip bash dan sekarang nginx adalah proses menjalankan utama wadah, bukan skrip. Saya menganggap ini hanya untuk kebersihan, kecuali orang lain tahu alasan yang lebih konkret untuk itu?gnome-terminal
, yang setidaknya pada 14,04 memiliki skrip wrapper untuk mengatur argumen. Dan itulah satu-satunya tujuan mereka, benar-benar mengatur seni dan lingkungan. Kasus lain adalah membersihkan - membunuh instance sebelumnya dari suatu proses terlebih dahulu dan meluncurkan yang baruexec
contoh lain yang mirip dengannginx
contoh yang diberikan oleh @LukeGriffiths adalah~/.vnc/xstartup
skrip yangvncserver
digunakan untuk mengkonfigurasi proses server VNC dan kemudianexec gnome-session
atauexec startkde
seterusnya.exec
dalam skrip startup wadah adalah bahwa PID 1, ENTRYPOINT penampung, memiliki makna khusus di Docker. Ini adalah proses utama yang menerima sinyal, dan ketika ada, wadah juga keluar.exec
hanya cara untuk mengambilsh
dari rantai komando ini, dan menjadikan daemon proses utama dari wadah.exec
adalah perintah dengan dua perilaku yang sangat berbeda, tergantung pada apakah setidaknya satu argumen digunakan dengannya, atau tidak ada argumen yang digunakan sama sekali.Jika setidaknya satu argumen dilewati, yang pertama diambil sebagai nama perintah dan
exec
mencoba untuk mengeksekusinya sebagai perintah yang melewati argumen yang tersisa, jika ada, untuk perintah itu dan mengelola pengalihan, jika ada.Jika perintah yang dilewati sebagai argumen pertama tidak ada, shell saat ini, tidak hanya perintah exec, yang keluar karena kesalahan.
Jika perintah ada dan dapat dieksekusi, itu menggantikan shell saat ini. Itu berarti bahwa jika
exec
muncul dalam skrip, instruksi yang mengikuti panggilan exec tidak akan pernah dieksekusi (kecuali jikaexec
itu sendiri dalam sebuah subkulit).exec
tidak pernah kembali. Perangkap shell seperti "EXIT" juga tidak akan terpicu.Jika tidak ada argumen yang diteruskan,
exec
hanya digunakan untuk mendefinisikan kembali deskriptor file shell saat ini. Shell melanjutkan setelahexec
, tidak seperti kasus sebelumnya, tetapi input standar, output, kesalahan atau deskriptor file apa pun yang telah dialihkan berpengaruh.Jika beberapa pengalihan digunakan
/dev/null
, input apa pun darinya akan mengembalikan EOF dan output apa pun ke sana akan dibuang.Anda dapat menutup deskriptor file dengan menggunakan
-
sebagai sumber atau tujuan, misalnyaexec <&-
. Membaca atau menulis selanjutnya akan gagal.Berikut ini dua contoh:
Script ini akan menampilkan "foo" sebagai perintah cat, alih-alih menunggu input pengguna seperti yang akan dilakukan dalam kasus biasa akan mengambil inputnya dari file / tmp / bar yang berisi foo.
Script ini akan menampilkan
4
(jumlah byte di / tmp / bar) dan segera berakhir. Thecat
perintah tidak akan dieksekusi.sumber
/dev/null
, jadi menulis masih berhasil dan membaca pengembalian EOF.close(2)
pada fd akan menyebabkan panggilan sistem baca / tulis untuk mengembalikan kesalahan, dan Anda melakukannya denganexec 2>&-
misalnya.exec 3</dev/null;
ls -l /proc/self/fd
perhatikan bahwa fd 3 akan terbuka hanya baca di / dev / null. Kemudian tutup kembali denganexec 3<&-
, dan Anda dapat melihat (denganls -l /proc/$$/fd
lagi) bahwa proses shell Anda tidak memiliki fd 3 lagi. (menutup stdin denganexec <&-
dapat berguna dalam skrip, tetapi secara interaktif itu adalah logout.)exec
jawaban yang paling banyak dipilih saat ini hanya berbicara tentang satu kasus penggunaan dan jawaban lainnya oleh g_p hanya berbicara tentang kasus penggunaan lainnya. Dan jawaban ini bagus dan ringkas / mudah dibaca untuk masalah subjek yang kompleks.Untuk memahami
exec
Anda harus terlebih dahulu mengertifork
. Saya mencoba untuk membuatnya singkat.Ketika Anda sampai di pertigaan jalan, Anda biasanya memiliki dua pilihan. Program Linux mencapai pertigaan ini di jalan ketika mereka menekan
fork()
system call.Program normal adalah perintah sistem yang ada dalam formulir yang dikompilasi di sistem Anda. Ketika program seperti itu dijalankan, proses baru dibuat. Proses anak ini memiliki lingkungan yang sama dengan induknya, hanya nomor ID proses yang berbeda. Prosedur ini disebut forking .
exec
ini digunakan.exec
akan mengganti konten dari proses yang sedang berjalan dengan informasi dari program biner.sumber
exec
redirect dapat menghasilkan skrip, seperti pada tautan yang saya posting?Di
bash
, jika Anda melakukannyahelp exec
:Bit yang relevan:
exec
adalah shell builtin , yang merupakan shell yang setara denganexec
keluarga pemanggilan sistem yang dibicarakan G_P (dan halaman manual yang tampaknya Anda baca). Itu hanya memiliki fungsi mandat POSIX mempengaruhi shell saat ini jika tidak ada perintah yang ditentukan.sumber