Chạy Bash chi tiết

Nếu bạn tìm thấy trang này khi tìm kiếm, có thể bạn đang cố giải quyết một số vấn đề bằng cách chạy bash.

Có lẽ môi trường bash của bạn không đặt biến môi trường và bạn không hiểu tại sao. Bạn có thể đã mắc kẹt thứ gì đó trong các tệp hoặc hồ sơ khởi động bash khác nhau hoặc tất cả các tệp một cách ngẫu nhiên cho đến khi nó hoạt động.

Trong mọi trường hợp, mục đích của ghi chú này là đưa ra quy trình bắt đầu bash càng đơn giản càng tốt để bạn có thể giải quyết các vấn đề.

Диаграмма

Lưu đồ này tóm tắt tất cả các tiến trình khi chạy bash.

Chạy Bash chi tiết

Bây giờ chúng ta hãy xem xét kỹ hơn từng phần.

Đăng nhập vỏ?

Trước tiên, bạn cần chọn xem bạn có ở trong shell đăng nhập hay không.

Shell đăng nhập là shell đầu tiên bạn nhập khi đăng nhập vào một phiên tương tác. Shell đăng nhập không yêu cầu tên người dùng và mật khẩu. Bạn có thể buộc shell đăng nhập bắt đầu bằng cách thêm cờ --login khi được gọi bash, ví dụ:

bash --đăng nhập

Shell đăng nhập thiết lập môi trường cơ sở khi bạn khởi động bash shell lần đầu tiên.

Tương tác?

Sau đó, bạn xác định xem shell có tương tác hay không.

Điều này có thể được kiểm tra bằng sự có mặt của biến PS1 (nó cài đặt chức năng nhập lệnh):

nếu [ "${PS1-}" ]; sau đó echo tương tác khác echo không tương tác fi

Hoặc xem tùy chọn đã được đặt chưa -i, sử dụng biến gạch nối đặc biệt - trong bash, ví dụ:

$echo$-

Nếu có một ký hiệu ở đầu ra i, thì shell có tính tương tác.

Trong vỏ đăng nhập?

Nếu bạn đang ở trong shell đăng nhập, thì bash sẽ tìm tệp /etc/profile và chạy nếu nó tồn tại.

Sau đó tìm kiếm bất kỳ tệp nào trong số ba tệp này theo thứ tự sau:

~/.bash_profile ~/.bash_login ~/.profile

Khi tìm thấy một cái, nó khởi động nó và bỏ qua những cái khác.

Trong một vỏ tương tác?

Nếu bạn đang ở trong shell không đăng nhập, giả định rằng bạn đã ở trong shell đăng nhập, môi trường đã được định cấu hình và sẽ được kế thừa.

Trong trường hợp này, hai tệp sau sẽ được thực thi theo thứ tự nếu chúng tồn tại:

/etc/bash.bashrc ~/.bashrc

Không có tùy chọn?

Nếu bạn không ở trong shell đăng nhập hoặc shell tương tác thì môi trường của bạn thực sự sẽ trống. Điều này gây ra nhiều nhầm lẫn (xem bên dưới về công việc định kỳ).

Trong trường hợp này bash nhìn vào biến BASH_ENV môi trường của bạn và tạo tệp tương ứng được chỉ định ở đó.

Những khó khăn và quy tắc chung của ngón tay cái

công việc định kỳ

95% thời gian tôi gỡ lỗi khởi động bash là do công việc định kỳ không chạy như mong đợi.

Nhiệm vụ chết tiệt này hoạt động tốt khi tôi chạy nó trên dòng lệnh, nhưng không thành công khi tôi chạy nó trong crontab.

Здесь Hai lý do:

  • Công việc định kỳ không có tính tương tác.
  • Không giống như các tập lệnh dòng lệnh, các lệnh cron không kế thừa môi trường shell.

Thông thường, bạn sẽ không nhận thấy hoặc quan tâm rằng tập lệnh shell không tương tác vì môi trường kế thừa từ shell tương tác. Điều này có nghĩa là mọi thứ PATH и alias được cấu hình như bạn mong đợi.

Đây là lý do tại sao thường cần phải thiết lập một thời gian cụ thể PATH cho một nhiệm vụ cron như ở đây:

* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram

Kịch bản gọi nhau

Một vấn đề phổ biến khác là khi các tập lệnh bị cấu hình nhầm để gọi nhau. Ví dụ, /etc/profile kháng cáo ~/.bashrc.

Điều này thường xảy ra khi ai đó cố gắng sửa một số lỗi và mọi thứ dường như đều hoạt động. Thật không may, khi bạn cần tách biệt các loại phiên khác nhau này, các vấn đề mới sẽ phát sinh.

Hình ảnh Docker được đóng hộp cát

Để thử nghiệm chạy shell, tôi đã tạo một hình ảnh Docker có thể được sử dụng để gỡ lỗi khi chạy shell trong môi trường an toàn.

Phóng:

$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash

Dockerfile được đặt đây.

Để buộc đăng nhập và mô phỏng shell đăng nhập:

$ bash --login

Để kiểm tra một tập hợp các biến BASH_ENV:

$ env | grep BASH_ENV

Để gỡ lỗi crontab một tập lệnh đơn giản sẽ được thực thi mỗi phút (trong /root/ascript):

$ crontab -l
$ cat /var/log/script.log

Nguồn: www.habr.com

Thêm một lời nhận xét