Adakah yang bisa menjelaskan apa kegunaan perintah exec dalam skrip shell dengan contoh sederhana?
Adakah yang bisa menjelaskan apa kegunaan perintah exec dalam skrip shell dengan contoh sederhana?
Jawaban:
Perintah exec
built-in mencerminkan fungsi-fungsi di kernel, ada satu keluarga berdasarkan execve
, yang biasanya dipanggil dari C.
exec
menggantikan program saat ini dalam proses saat ini, tanpa fork
proses baru. Ini bukan sesuatu yang akan Anda gunakan dalam setiap skrip yang Anda tulis, tetapi kadang-kadang berguna. Berikut adalah beberapa skenario yang telah saya gunakan;
Kami ingin pengguna menjalankan program aplikasi tertentu tanpa akses ke shell. Kami dapat mengubah program masuk di / etc / passwd, tapi mungkin kami ingin pengaturan lingkungan digunakan dari file start-up. Jadi, dalam (katakanlah) .profile
, pernyataan terakhir mengatakan sesuatu seperti:
exec appln-program
jadi sekarang tidak ada shell untuk kembali. Bahkan jika appln-program
crash, pengguna akhir tidak bisa mendapatkan shell, karena tidak ada - exec
diganti.
Kami ingin menggunakan shell yang berbeda dengan yang ada di / etc / passwd. Bodoh seperti yang terlihat, beberapa situs tidak mengizinkan pengguna untuk mengubah shell masuk mereka. Satu situs yang saya tahu memiliki semua orang mulai dengan csh
, dan semua orang hanya .login
panggilan (csh start-up file) panggilan mereka ksh
. Sementara itu berhasil, ia meninggalkan csh
proses nyasar berjalan, dan logout adalah dua tahap yang bisa membingungkan. Jadi kami mengubahnya exec ksh
yang baru saja mengganti program c-shell dengan korn shell, dan membuat semuanya lebih sederhana (ada masalah lain dengan ini, seperti fakta bahwa ksh
itu bukan shell-login).
Hanya untuk menghemat proses. Jika kita memanggil prog1 -> prog2 -> prog3 -> prog4
dll dan tidak pernah kembali, maka buat setiap panggilan sebagai exec. Menghemat sumber daya (tidak banyak, diakui, kecuali diulang) dan membuat shutdown lebih mudah.
Anda jelas telah melihat exec
digunakan di suatu tempat, mungkin jika Anda menunjukkan kode yang mengganggu Anda, kami dapat membenarkan penggunaannya.
Sunting : Saya menyadari bahwa jawaban saya di atas tidak lengkap. Ada dua penggunaan exec
di shell seperti ksh
dan bash
- digunakan untuk membuka deskriptor file. Berikut ini beberapa contohnya:
exec 3< thisfile # open "thisfile" for reading on file descriptor 3
exec 4> thatfile # open "thatfile" for writing on file descriptor 4
exec 8<> tother # open "tother" for reading and writing on fd 8
exec 6>> other # open "other" for appending on file descriptor 6
exec 5<&0 # copy read file descriptor 0 onto file descriptor 5
exec 7>&4 # copy write file descriptor 4 onto 7
exec 3<&- # close the read file descriptor 3
exec 6>&- # close the write file descriptor 6
Perhatikan bahwa spasi sangat penting di sini. Jika Anda menempatkan spasi antara angka fd dan simbol pengalihan maka exec
kembali ke makna aslinya:
exec 3 < thisfile # oops, overwrite the current program with command "3"
Ada beberapa cara Anda dapat menggunakan ini, pada penggunaan ksh read -u
atau print -u
, pada bash
, misalnya:
read <&3
echo stuff >&4
exec gunicorn
memberikan pid yang benar kembali ke penyelia.
exec
dapat digunakan untuk pengalihan:> Jika perintah tidak ditentukan, setiap pengalihan berlaku di shell saat ini, dan status kembali adalah 0. Jika ada kesalahan pengalihan, status kembali adalah 1. Tapi bagaimana melakukan exec
sebenarnya bekerja untuk mengubah file descriptor? Mengapa perintah khusus ini dipilih untuk tugas ini? (Penurunan harga gagal sekarang?)
exec >.\logfilename.log 2>&1
&>
adalah bash
ekstensi (lihat man bash
) dan contoh Anda setara dengan exec >/var/log/userdata.log 2>&1
. Dengan kata lain itu mengarahkan stdout dan stderr ke file itu. Perintah yang mengikuti akan mewarisi pengalihan tersebut kecuali jika disetel ulang, tetapi akan dieksekusi.
Hanya untuk menambah jawaban yang diterima dengan jawaban singkat ramah-pemula yang singkat, Anda mungkin tidak perlu exec
.
Jika Anda masih di sini, diskusi berikut semoga mengungkap alasannya. Ketika Anda berlari, katakan,
sh -c 'command'
Anda menjalankan sebuah sh
instance, lalu mulai command
sebagai anak dari sh
instance itu. Saat command
selesai, sh
instance juga selesai.
sh -c 'exec command'
menjalankan sh
contoh, kemudian menggantikan bahwa sh
misalnya dengan command
biner, dan berjalan yang sebaliknya.
Tentu saja, keduanya tidak berguna dalam konteks terbatas ini; Anda hanya ingin
command
Ada beberapa situasi pinggiran di mana Anda ingin shell membaca file konfigurasinya atau entah bagaimana mengatur lingkungan sebagai persiapan untuk menjalankan command
. Ini adalah satu-satunya situasi di mana exec command
berguna.
#!/bin/sh
ENVIRONMENT=$(some complex task)
exec command
Ini melakukan beberapa hal untuk mempersiapkan lingkungan sehingga mengandung apa yang dibutuhkan. Setelah selesai, sh
instance tidak lagi diperlukan, dan itu merupakan optimasi (minor) untuk hanya mengganti sh
instance dengan command
proses, daripada sh
menjalankannya sebagai proses anak dan menunggu untuk itu, kemudian keluar segera setelah selesai.
Demikian pula, jika Anda ingin membebaskan sumber daya sebanyak mungkin untuk perintah yang berat di akhir skrip shell, Anda mungkin ingin exec
perintah itu sebagai optimasi.
Jika ada sesuatu yang memaksa Anda untuk berlari sh
tetapi Anda benar-benar ingin menjalankan sesuatu yang lain, exec something else
tentu saja merupakan solusi untuk mengganti sh
instance yang tidak diinginkan (seperti misalnya jika Anda benar-benar ingin menjalankan spiffy Anda sendiri gosh
alih-alih sh
tetapi milik Anda tidak terdaftar /etc/shells
sehingga Anda dapat tentukan sebagai shell login Anda).
Penggunaan kedua exec
untuk memanipulasi deskriptor file adalah topik yang terpisah. Jawaban yang diterima mencakup hal itu dengan baik; untuk menjaga ini mandiri, saya hanya akan tunduk pada manual untuk apa pun exec
yang diikuti dengan pengalihan alih-alih nama perintah.