Menjalankan Bash secara terperinci

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.

Menjalankan Bash secara terperinci

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 di sini.

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

Tambah komen