Jika Anda menemukan halaman ini dalam pencarian, Anda mungkin mencoba menyelesaikan beberapa masalah dengan menjalankan bash.
Mungkin lingkungan bash Anda tidak menyetel variabel lingkungan dan Anda tidak mengerti alasannya. Anda mungkin terjebak sesuatu di berbagai file atau profil boot bash atau semua file secara acak hingga berhasil.
Bagaimanapun, inti dari catatan ini adalah untuk menjelaskan prosedur memulai bash sesederhana mungkin sehingga Anda dapat mengatasi masalah.
Diagram
Diagram alur ini merangkum semua proses saat menjalankan bash.
Sekarang mari kita lihat lebih dekat setiap bagiannya.
Masuk Shell?
Pertama, Anda harus memilih apakah Anda berada di shell login atau tidak.
Shell login adalah shell pertama yang Anda masukkan saat Anda login untuk sesi interaktif. Shell login tidak memerlukan nama pengguna dan kata sandi. Anda dapat memaksa shell login untuk memulai dengan menambahkan sebuah tanda --login
saat dipanggil bash
, misalnya:
pesta --login
Shell login menyiapkan lingkungan dasar saat Anda pertama kali memulai bash shell.
Interaktif?
Kemudian Anda menentukan apakah shell itu interaktif atau tidak.
Hal ini dapat diperiksa dengan keberadaan variabel PS1
(itu menginstal fungsi input perintah):
jika [ "${PS1-}" ]; lalu gema interaktif jika tidak, gema fi non-interaktif
Atau lihat apakah opsi sudah disetel -i
, menggunakan variabel tanda hubung khusus -
di bash, misalnya:
$gema$-
Jika ada simbol di output i
, maka shellnya interaktif.
Di shell masuk?
Jika Anda menggunakan shell login, maka bash mencari file tersebut /etc/profile
dan berjalan jika ada.
Kemudian cari salah satu dari ketiga file ini dengan urutan berikut:
~/.bash_profile ~/.bash_login ~/.profile
Ketika ia menemukan satu, ia memulainya dan melewatkan yang lain.
Dalam shell interaktif?
Jika Anda menggunakan shell non-login, diasumsikan bahwa Anda sudah berada di shell login, lingkungan telah dikonfigurasi dan akan diwarisi.
Dalam hal ini, dua file berikut dijalankan secara berurutan, jika ada:
/etc/bash.bashrc ~/.bashrc
Tidak ada pilihan?
Jika Anda tidak berada dalam shell login atau shell interaktif, maka lingkungan Anda memang akan kosong. Hal ini menyebabkan banyak kebingungan (lihat di bawah tentang pekerjaan cron).
Dalam hal ini bash melihat variabelnya BASH_ENV
lingkungan Anda dan membuat file terkait yang ditentukan di sana.
Kesulitan Umum dan Aturan Praktis
pekerjaan cron
95% dari waktu saya men-debug startup bash itu karena tugas cron tidak berjalan seperti yang diharapkan.
Tugas sialan ini berfungsi dengan baik saat saya menjalankannya di baris perintah, tetapi gagal saat saya menjalankannya di crontab.
Di sini dua alasan:
- Pekerjaan Cron tidak interaktif.
- Tidak seperti skrip baris perintah, tugas cron tidak mewarisi lingkungan shell.
Biasanya Anda tidak akan memperhatikan atau peduli bahwa skrip shell tidak interaktif karena lingkungannya mewarisi shell interaktif. Artinya semuanya PATH
ΠΈ alias
dikonfigurasi seperti yang Anda harapkan.
Inilah sebabnya mengapa sering kali perlu menetapkan sesuatu yang spesifik PATH
untuk tugas cron seperti di sini:
* * * * * PATH=${PATH}:/path/ke/my/program/folder myprogram
Script saling memanggil
Masalah umum lainnya adalah ketika skrip salah dikonfigurasi untuk saling memanggil. Misalnya, /etc/profile
menarik untuk ~/.bashrc
.
Ini biasanya terjadi ketika seseorang mencoba memperbaiki beberapa kesalahan dan semuanya tampak berhasil. Sayangnya, ketika Anda perlu memisahkan berbagai jenis sesi ini, masalah baru pun muncul.
Gambar Docker dalam kotak pasir
Untuk bereksperimen menjalankan shell, saya membuat image Docker yang dapat digunakan untuk men-debug menjalankan shell di lingkungan yang aman.
Meluncurkan:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
Dockerfile berada
Untuk memaksa login dan mensimulasikan shell login:
$ bash --login
Untuk menguji sekumpulan variabel BASH_ENV
:
$ env | grep BASH_ENV
Untuk debugging crontab
skrip sederhana akan dieksekusi setiap menit (dalam /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
Sumber: www.habr.com