Bash diluncurkan secara detail

Jika Anda menemukan halaman ini dalam pencarian, maka Anda mungkin mencoba menyelesaikan beberapa masalah dengan menjalankan bash.

Ada kemungkinan bahwa bash lingkungan Anda tidak menetapkan variabel lingkungan dan Anda tidak mengerti mengapa. Anda mungkin memasukkan sesuatu ke berbagai file boot bash atau ke dalam profil, atau ke semua file secara acak hingga berfungsi.

Bagaimanapun, tujuan dari catatan ini adalah untuk menguraikan prosedur startup bash semudah mungkin sehingga Anda dapat mengatasi masalah.

Bagan


Diagram alir ini merangkum semua proses saat menjalankan bash.



Sekarang mari kita melihat lebih dekat pada setiap bagian.

Login Shell?


Pertama, Anda perlu memilih apakah Anda berada di shell login atau tidak.

Shell login adalah shell pertama yang Anda masukkan ketika Anda login untuk sesi interaktif. Shell login tidak memerlukan nama pengguna dan kata sandi. Anda dapat memaksa peluncuran shell login dengan menambahkan flag --login saat memanggil bash , misalnya:

  bash - login 

Shell login mengkonfigurasi lingkungan dasar ketika Anda pertama kali menjalankan bash shell.

Interaktif?


Kemudian Anda menentukan apakah shell itu interaktif atau tidak.

Ini dapat diperiksa dengan kehadiran variabel PS1 (ini menetapkan fungsi input perintah):

  if ["$ {PS1-}"];  lalu
   gema interaktif
 lain
   gema non-interaktif
 fi 

Atau lihat apakah opsi -i diatur menggunakan variabel tanda hubung khusus dalam bash, misalnya:

  $ echo $ - 

Jika ada i dalam output, maka shell bersifat interaktif.

Di shell login?


Jika Anda berada di shell login, maka bash mencari file /etc/profile dan berjalan jika ada.

Kemudian ia mencari salah satu dari tiga file ini dalam urutan sebagai berikut:

  ~ / .bash_profile
 ~ / .bash_login
 ~ /. profil 

Ketika menemukan satu, meluncurkan dan melompati yang lain.

Dalam shell interaktif?


Jika Anda berada di shell interaktif tanpa login (shell non-login), diasumsikan bahwa Anda telah mengunjungi shell login, lingkungan dikonfigurasikan dan akan diwarisi.

Dalam hal ini, dua file berikut dijalankan secara berurutan, jika ada:

  /etc/bash.bashrc
 ~ / .bashrc 

Bukan satu opsi?


Jika Anda tidak berada di shell login atau di shell interaktif, maka lingkungan Anda memang akan kosong. Ini menyebabkan banyak kebingungan (lihat pekerjaan cron di bawah).

Dalam hal ini, bash melihat variabel BASH_ENV dari lingkungan Anda dan mengeksekusi file yang sesuai yang tercantum di sana.

Kesulitan dan aturan praktis yang khas


Pekerjaan Cron


Dalam 95% kasus, saya telah men-debug peluncuran bash karena fakta bahwa pekerjaan cron tidak berfungsi seperti yang diharapkan.

Tugas sialan ini berfungsi dengan baik ketika saya menjalankannya di baris perintah, tetapi gagal ketika dijalankan di crontab .

Ada dua alasan :

  • Pekerjaan Cron tidak interaktif.
  • Tidak seperti skrip baris perintah, pekerjaan cron tidak mewarisi lingkungan shell.

Biasanya Anda tidak memperhatikan atau peduli bahwa skrip shell tidak interaktif karena lingkungan mewarisi dari shell interaktif. Ini berarti bahwa semua PATH dan alias dikonfigurasikan seperti yang Anda harapkan.

Inilah sebabnya mengapa Anda sering harus menetapkan PATH spesifik untuk tugas cron, seperti di sini:

  * * * * * PATH = $ {PATH}: / path / ke / my / program / folder myprogram 

Script yang saling memanggil


Masalah umum lainnya adalah ketika skrip dikonfigurasi secara salah untuk saling memanggil. Sebagai contoh, /etc/profile merujuk ke ~/.bashrc .

Biasanya ini terjadi ketika seseorang mencoba untuk memperbaiki beberapa jenis kesalahan dan semuanya tampak berhasil. Sayangnya, ketika Anda perlu memisahkan berbagai jenis sesi ini, masalah baru muncul.

Gambar Docker Sandbox


Untuk bereksperimen dengan startup shell, saya membuat gambar Docker yang dapat Anda gunakan untuk debug startup shell di lingkungan yang aman.

Luncurkan:

 $ docker run -n bs -d imiell/bash_startup $ docker exec -ti bs bash 

Dockerfile ada di sini .

Untuk memaksa login dan mensimulasikan shell login:

 $ bash --login 

Untuk memeriksa set variabel BASH_ENV :

 $ env | grep BASH_ENV 

Untuk men-debug crontab skrip sederhana akan dieksekusi setiap menit (di /root/ascript ):

 $ crontab -l $ cat /var/log/script.log 

Source: https://habr.com/ru/post/id452410/


All Articles