Bu sayfayı bir aramada bulduysanız, muhtemelen bash çalıştırmayla ilgili bir sorunu çözmeye çalışıyorsunuzdur.
Belki de bash ortamınız bir ortam değişkeni ayarlamıyordur ve nedenini anlamıyorsunuz. Çalışıncaya kadar çeşitli bash önyükleme dosyalarına veya profillerine veya tüm dosyalara rastgele bir şey yapıştırmış olabilirsiniz.
Her durumda, bu notun amacı, sorunları çözebilmeniz için bash'ı başlatma prosedürünü mümkün olduğunca basit bir şekilde ortaya koymaktır.
Диаграмма
Bu akış şeması bash çalıştırılırken yapılan tüm işlemleri özetler.
Şimdi her bir parçaya daha yakından bakalım.
Giriş Kabuğu?
Öncelikle giriş kabuğunda olup olmadığınızı seçmeniz gerekir.
Oturum açma kabuğu, etkileşimli bir oturum için oturum açtığınızda girdiğiniz ilk kabuktur. Oturum açma kabuğu kullanıcı adı ve parola gerektirmez. Bir bayrak ekleyerek giriş kabuğunu başlamaya zorlayabilirsiniz. --login
çağrıldığında bash
Örneğin:
bash --giriş
Oturum açma kabuğu, bash kabuğunu ilk başlattığınızda temel ortamı ayarlar.
İnteraktif mi?
Daha sonra kabuğun etkileşimli olup olmadığını belirlersiniz.
Bu, değişkenin varlığıyla kontrol edilebilir PS1
(komut giriş fonksiyonunu yükler):
if [ "${PS1-}" ]; sonra echo etkileşimli else echo etkileşimli olmayan fi
Veya seçeneğin ayarlanıp ayarlanmadığını görün -i
özel bir tire değişkeni kullanarak -
örneğin bash'ta:
$echo$-
Çıktıda bir sembol varsa i
, o zaman kabuk etkileşimlidir.
Giriş kabuğunda mı?
Oturum açma kabuğundaysanız bash dosyayı arar /etc/profile
ve varsa çalışır.
Daha sonra bu üç dosyadan herhangi birini aşağıdaki sırayla arar:
~/.bash_profile ~/.bash_login ~/.profile
Birini bulduğunda onu başlatır ve diğerlerini atlar.
Etkileşimli bir kabukta mı?
Oturum açmayan bir kabuktaysanız, zaten bir oturum açma kabuğunda bulunduğunuz, ortamın yapılandırıldığı ve devralınacağı varsayılır.
Bu durumda, eğer varsa, aşağıdaki iki dosya sırayla yürütülür:
/etc/bash.bashrc ~/.bashrc
Seçenek yok?
Bir oturum açma kabuğunda veya etkileşimli bir kabukta değilseniz, ortamınız gerçekten boş olacaktır. Bu çok fazla kafa karışıklığına neden olur (cron işleri hakkında aşağıya bakın).
Bu durumda bash değişkene bakar BASH_ENV
ortamınız ve orada belirtilen ilgili dosyayı oluşturur.
Yaygın Zorluklar ve Temel Kurallar
Cron işleri
Bash başlangıcında hata ayıklamamın %95'i cron işinin beklendiği gibi çalışmamasından kaynaklanıyor.
Bu lanet görev komut satırında çalıştırdığımda düzgün çalışıyor ancak crontab'da çalıştırdığımda başarısız oluyor.
öyle iki sebep:
- Cron işleri etkileşimli değildir.
- Komut satırı komut dosyalarının aksine, cron işleri kabuk ortamını devralmaz.
Ortam etkileşimli kabuktan miras aldığı için genellikle bir kabuk komut dosyasının etkileşimli olmadığını fark etmez veya umursamazsınız. Bu şu anlama geliyor: her şey PATH
и alias
beklediğiniz gibi yapılandırılmıştır.
Bu nedenle genellikle belirli bir değer belirlemek gerekir. PATH
buradaki gibi bir cron görevi için:
* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram
Scriptler birbirini çağırıyor
Diğer bir yaygın sorun, komut dosyalarının yanlışlıkla birbirini çağıracak şekilde yapılandırılmasıdır. Örneğin, /etc/profile
hitap eder ~/.bashrc
.
Bu genellikle birisi bir hatayı düzeltmeye çalıştığında ve her şey çalışıyor gibi göründüğünde olur. Ne yazık ki bu farklı seans türlerini ayırmak gerektiğinde yeni sorunlar ortaya çıkıyor.
Korumalı alana alınmış Docker görüntüsü
Bir kabuk çalıştırmayı denemek için, bir kabuğun güvenli bir ortamda çalıştırılmasında hata ayıklamak için kullanılabilecek bir Docker görüntüsü oluşturdum.
Başlatmak:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
Dockerfile'ın bulunduğu yer
Oturum açmayı zorlamak ve oturum açma kabuğunu simüle etmek için:
$ bash --login
Bir dizi değişkeni test etmek için BASH_ENV
:
$ env | grep BASH_ENV
Hata ayıklama için crontab
her dakika basit bir komut dosyası çalıştırılacaktır (içinde /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
Kaynak: habr.com