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