Menjalankan Bash secara detail

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.

Menjalankan Bash secara detail

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

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

Tambah komentar