Penggunaan Perintah Exec di Skrip Shell

Penggunaan Perintah Exec Di Skrip Shell



Panduan ini menguraikan perintah exec dan penggunaannya dalam skrip shell.

Prasyarat:

Untuk melakukan langkah-langkah yang ditunjukkan dalam panduan ini, Anda memerlukan komponen berikut:

  • Sistem Linux fungsional. Belajar lebih tentang menyiapkan VM Ubuntu menggunakan VirtualBox .
  • Akses ke a pengguna non-root dengan hak istimewa sudo .
  • Editor teks yang cocok. Misalnya: Mengapa / NeoVim , Nano , Teks luhur , VSCodium , dll.

Perintah Eksekusi

Perintah exec bukanlah alat terpisah dengan sendirinya:







$ yang eksekusi



Sebaliknya, ini adalah perintah internal dari Bash shell:



$ pria eksekusi





Seperti yang disarankan oleh deskripsi dari halaman manual, jika sebuah perintah ditentukan, exec mengganti shell dengan itu, tidak menghasilkan proses tambahan. Ada beberapa opsi yang tersedia yang mengubah perilaku perintah exec.



Penggunaan Dasar

Secara default, setiap kali menjalankan perintah, Bash memunculkan subkulit dan membagi perintah.

$ gema $$ && tidur 999

$ pstree -P

Di sini, perintah echo mencetak PID dari shell saat ini. Shell Bash (PID: 978) memunculkan proses anak baru untuk bekerja dengan perintah tidur (PID: 8369).

Sekarang, bagaimana jika kita menjalankan perintah sleep menggunakan exec?

$ gema $$ && eksekusi tidur 999

$ pstre -p

Proses induk Bash diganti dengan perintah tidur. Setelah eksekusi berhasil, itu tidak kembali ke shell. Sebaliknya, sesi diakhiri.

Lingkungan bersih

Konfigurasi Bash default dilengkapi dengan banyak tweak dan variabel lingkungan. Dalam skenario tertentu (debugging, misalnya), Anda mungkin ingin menjalankan skrip/program Anda di lingkungan yang bersih. Dengan bantuan exec, kita dapat meluncurkan instance shell bersih menggantikan yang sekarang.

Pertama, gunakan perintah printenv untuk mencantumkan semua variabel lingkungan yang saat ini dikonfigurasi:

$ printenv

Sekarang, gunakan exec untuk meluncurkan instance bersih:

$ eksekusi -C pesta

$printenv

Meluncurkan Shell yang Berbeda

Selain Bash dan 'sh', ada beberapa program shell lain yang tersedia, masing-masing dengan fasilitas uniknya. Jika suatu program/skrip memerlukan shell tertentu, Anda dapat menggunakan exec untuk mengganti shell Bash saat ini dengan yang diinginkan.

Dalam contoh berikut, kami mengganti Bash dengan 'sh':

$ pstree -P

$ eksekusi SH

$ pstree -P

Menggunakan Exec dalam Script

Dengan dasar-dasarnya, kita sekarang dapat mulai menggunakan exec di skrip shell kita.

Contoh 1: Bekerja dengan Shell yang Berbeda

Lihat skrip berikut:

#!/bin/bash

gema $SHELL

gema 'echo zsh berhasil diluncurkan' > zsh.sh

eksekusi zsh zsh.sh

Di sini, perintah gema pertama mencetak shell saat ini. Secara default, itu harus Bash. Kemudian, perintah exec meluncurkan 'zsh' untuk menjalankan skrip 'zsh.sh'.

Jalankan skrip berikut:

$ . / test.sh

Contoh 2: Mengesampingkan Proses yang Ada

Setiap kali memanggil perintah/program, Bash memunculkan proses baru. Dalam kebanyakan situasi, ini bukan masalah yang memprihatinkan. Namun, saat bekerja dengan sistem dengan sumber daya yang sangat terbatas (perangkat keras tertanam, misalnya), menggunakan exec untuk mengesampingkan proses yang ada di memori dapat membantu.

Lihat skrip berikut:

#!/bin/bash

pstree -P

eksekusi pstree -P

gema 'Halo Dunia'

Di sini, perintah pstree pertama menunjukkan tata letak asli dari pohon proses. Setelah perintah exec dijalankan, perintah pstree kedua menggantikan shell yang sedang berjalan. Perintah gema pada baris terakhir tidak dijalankan.

Jalankan skrip berikut:

$ . / test.sh

Karena itu adalah bagian dari skrip, kami kembali ke shell asli setelah eksekusi berhasil.

Karena perintah exec menggantikan Shell induk dengan perintah/program yang berbeda, kode apa pun setelah itu menjadi tidak valid. Berhati-hatilah saat menggunakannya dalam skrip Anda.

Contoh 3: Pencatatan

Bash Shell menawarkan 3 deskriptor file unik untuk semua program/skrip yang sedang berjalan:

  • STDOUT (1): keluaran standar, menyimpan keluaran normal
  • STDERR (2): kesalahan standar, menyimpan pesan kesalahan
  • STDIN (0): masukan standar

Menggunakan exec, kita dapat mengarahkan deskriptor file ini ke lokasi lain, misalnya: file log. Ini dapat membantu dengan debugging dan logging secara umum.

Umumnya, jika Anda ingin mengalihkan STDOUT dan STDERR ke file log, Anda menggunakan operator pengalihan:

$ gema $$ | tee test.log

$ biksu 2 >& 1 | tee test.log

Metode ini memerlukan pengalihan di setiap titik yang ingin Anda catat. Untuk mengatasi masalah ini, kita dapat menggunakan perintah exec untuk membuat redirect permanen untuk sesi shell. Lihat contoh berikut:

#!/bin/bash

> test.log

eksekusi 1 >> test.log

eksekusi 2 >& 1

gema 'Halo Dunia'

perintah_salah

Di sini, baris pertama membuat file log kosong. Perintah exec pertama menetapkan pengalihan permanen STDOUT ke file log. Perintah exec kedua mengalihkan STDERR ke STDOUT.

Dengan pengaturan ini, semua keluaran dan pesan kesalahan dibuang ke file log:

$ . / test.sh

$ kucing test.log

Bagaimana jika skrip menghasilkan entri log yang berkelanjutan?

#!/bin/bash

> test.log

eksekusi 1 >> test.log

eksekusi 2 >& 1

ketika BENAR

Mengerjakan

gema $ACAK

tidur 5

Selesai

Di sini, di bagian pertama, kami membuat pengalihan permanen STDOUT dan STDERR ke file log kami. Infinite while loop menjalankan perintah echo sampai kita menutupnya secara paksa menggunakan 'Ctrl + C'. Variabel $RANDOM adalah variabel khusus yang mengembalikan string acak setiap kali diakses.

Untuk memeriksa entri log pembaruan, gunakan perintah ekor berikut:

$ ekor -F test.log

Perhatikan bahwa pengalihan ini hanya berlangsung selama sesi shell.

Contoh 4: Input dari File

Mirip dengan cara kami membuat pengalihan STDOUT dan STDERR permanen, kami juga dapat membuatnya untuk STDIN. Namun, karena STDIN digunakan sebagai input, penerapannya sedikit berbeda.

Dalam skrip berikut, kami mengambil STDIN dari file:

#!/bin/bash

gema 'gema' Halo Dunia '' > memasukkan

eksekusi < memasukkan

membaca baris_1

eval $baris_1

Di sini, di baris pertama, kami menggunakan gema untuk menghasilkan konten file input_string menggunakan pengalihan. Perintah exec mengalihkan konten input_string ke STDIN dari sesi shell saat ini. Setelah membaca string, kami menggunakan eval untuk memperlakukan konten $line_1 sebagai kode shell.

Jalankan skrip berikut:

$ . / test.sh

Kesimpulan

Kami membahas tentang perintah exec di Bash. Kami juga memamerkan berbagai cara menggunakannya dalam skrip. Kami mendemonstrasikan menggunakan exec untuk bekerja dengan banyak shell, membuat skrip hemat memori, dan mengarahkan ulang deskriptor file.

Ini hanyalah sebagian kecil dari apa yang dapat dicapai dengan menggunakan skrip Bash. Pelajari lebih lanjut tentang skrip Bash dari Pemrograman bash sub-kategori.

Selamat menghitung!