Jika anda menjumpai halaman ini dalam carian, anda mungkin cuba menyelesaikan beberapa masalah dengan menjalankan bash.
Mungkin persekitaran bash anda tidak menetapkan pembolehubah persekitaran dan anda tidak faham mengapa. Anda mungkin telah menyimpan sesuatu dalam pelbagai fail but atau profil bash atau semua fail secara rawak sehingga ia berfungsi.
Walau apa pun, maksud nota ini adalah untuk menyusun prosedur untuk memulakan bash semudah mungkin supaya anda boleh menangani masalah.
Gambar rajah
Carta alir ini meringkaskan semua proses semasa menjalankan bash.
Sekarang mari kita lihat dengan lebih dekat setiap bahagian.
Log masuk Shell?
Mula-mula anda perlu memilih sama ada anda berada dalam shell log masuk atau tidak.
Shell log masuk ialah shell pertama yang anda masukkan apabila anda log masuk untuk sesi interaktif. Cangkang log masuk tidak memerlukan nama pengguna dan kata laluan. Anda boleh memaksa shell log masuk untuk bermula dengan menambahkan bendera --login
apabila dipanggil bash
, sebagai contoh:
bash --log masuk
Shell log masuk menyediakan persekitaran asas apabila anda mula-mula memulakan shell bash.
Interaktif?
Kemudian anda tentukan sama ada shell itu interaktif atau tidak.
Ini boleh disemak dengan kehadiran pembolehubah PS1
(ia memasang fungsi input arahan):
jika [ "${PS1-}" ]; kemudian bergema interaktif yang lain menggemakan fi bukan interaktif
Atau lihat jika pilihan ditetapkan -i
, menggunakan pembolehubah sempang khas -
dalam bash, sebagai contoh:
$echo$-
Jika terdapat simbol dalam output i
, maka shell adalah interaktif.
Dalam shell log masuk?
Jika anda berada dalam shell log masuk, maka bash mencari fail tersebut /etc/profile
dan berjalan jika ia wujud.
Kemudian cari mana-mana daripada tiga fail ini dalam susunan berikut:
~/.bash_profile ~/.bash_login ~/.profile
Apabila ia menemui satu, ia memulakannya dan melangkau yang lain.
Dalam shell interaktif?
Jika anda berada dalam shell bukan log masuk, diandaikan bahawa anda telah pun berada dalam shell log masuk, persekitaran dikonfigurasikan dan akan diwarisi.
Dalam kes ini, dua fail berikut dilaksanakan mengikut urutan, jika wujud:
/etc/bash.bashrc ~/.bashrc
Tiada pilihan?
Jika anda tidak berada dalam shell log masuk atau shell interaktif, maka persekitaran anda sememangnya akan kosong. Ini menyebabkan banyak kekeliruan (lihat di bawah tentang pekerjaan cron).
Dalam kes ini bash melihat pembolehubah BASH_ENV
persekitaran anda dan mencipta fail sepadan yang dinyatakan di sana.
Kesukaran dan Peraturan Biasa
pekerjaan cron
95% daripada masa saya menyahpepijat permulaan bash adalah kerana tugas cron tidak berjalan seperti yang diharapkan.
Tugas terkutuk ini berfungsi dengan baik apabila saya menjalankannya pada baris arahan, tetapi gagal apabila saya menjalankannya dalam crontab.
ia adalah dua sebab:
- Pekerjaan cron tidak interaktif.
- Tidak seperti skrip baris arahan, tugas cron tidak mewarisi persekitaran shell.
Biasanya anda tidak akan melihat atau mengambil berat bahawa skrip shell tidak interaktif kerana persekitaran mewarisi daripada shell interaktif. Ini bermakna segala-galanya PATH
ΠΈ alias
dikonfigurasikan seperti yang anda jangkakan.
Inilah sebabnya mengapa ia sering diperlukan untuk menetapkan tertentu PATH
untuk tugas cron seperti di sini:
* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram
Skrip memanggil satu sama lain
Satu lagi masalah biasa ialah apabila skrip tersalah konfigurasi untuk memanggil satu sama lain. Sebagai contoh, /etc/profile
merujuk kepada ~/.bashrc
.
Ini biasanya berlaku apabila seseorang cuba membetulkan beberapa ralat dan semuanya kelihatan berfungsi. Malangnya, apabila anda perlu memisahkan jenis sesi yang berbeza ini, masalah baru timbul.
Imej Docker Berkotak Pasir
Untuk bereksperimen dengan menjalankan shell, saya mencipta imej Docker yang boleh digunakan untuk nyahpepijat menjalankan shell dalam persekitaran yang selamat.
Pelancaran:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
Dockerfile terletak
Untuk memaksa log masuk dan mensimulasikan shell log masuk:
$ bash --login
Untuk menguji satu set pembolehubah BASH_ENV
:
$ env | grep BASH_ENV
Untuk debugging crontab
skrip mudah akan dilaksanakan setiap minit (dalam /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
Sumber: www.habr.com