Khi giải thích sơ đồ này
Tôi thấy rằng trong bash man:
Khi bash được gọi dưới dạng shell đăng nhập tương tác hoặc dưới dạng shell không tương tác với tùy chọn --login, trước tiên, nó sẽ đọc và thực thi các lệnh từ tệp / etc / profile, nếu tệp đó tồn tại.
Điều đó nói rằng các vỏ đăng nhập tương tác đọc /etc/profile
(không có --noprofile)
Ngoài ra, shell không tương tác với tùy chọn --login
đọc/etc/profile
Điều đó dường như để lại một số shell đăng nhập có thể (trong đó $0
bắt đầu bằng a -
) không tương tác (chạy tập lệnh, có thể đơn giản như date
) có thể không đọc (nguồn) /etc/profile
.
Để xác nhận hoặc từ chối ý tưởng này:
Đầu tiên tôi đã thử sử dụng su -l -
, nó bắt đầu một vỏ đăng nhập với -
ký tự đầu tiên nhưng tôi không làm cho nó không tương tác (và có thể trình bày các thử nghiệm để thăm dò nó).
Gọi một cái gì đó như
$ bash -c 'date' -bash
Không báo cáo là shell đăng nhập (ngay cả khi ký tự đầu tiên là a -
).
Hãy thử điều này để tiết lộ chi tiết:
$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016
Có
$0
một-
ký tự đầu tiên, không cói
(tương tác) trong giá trị của$-
nhưng nó không được báo cáo là mộtlogin_shell
(-u). Trong trường hợp này, / etc / profile không được đọc, nhưng tôi không chắc đây là bài kiểm tra đúng.
Ngoài ra còn có đề cập đến "vỏ đăng nhập không tương tác hiếm" trong câu trả lời này mà không đủ cụ thể cho câu hỏi này.
Các kết luận của anh chàng này là /etc/profile
luôn đọc.
Đọc bảng tóm tắt: cả vỏ đăng nhập tương tác và không tương tác đều đọc /etc/profile
Và, nếu các ví dụ từ trang này là chính xác:
Some examples
$ su bob # interactive non-login shell
$ su - bob # interactive login shell
$ exec su - bob # interactive login shell
$ exec su - bob -c 'env' # non-interactive login shell
$ ssh bob@example.com # interactive login shell, `~/.profile`
$ ssh bob@example.com env # non-interactive non-login shell, `~/.bashrc`
Các bài kiểm tra exec su - bob -c 'env'
báo cáo /etc/profile
đã được đọc.
Nói ngắn gọn:
Có thể có một vỏ đăng nhập không tương tác (không được gọi bằng --login hoặc -l) không?
Và nếu đúng, nó đang đọc /etc/profile
tập tin?
Nếu điều trên là đúng, chúng ta phải kết luận rằng TẤT CẢ các shell đăng nhập [tương tác (hoặc không)] đọc / etc / profile (không có --noprofile
tùy chọn).
Lưu ý: để phát hiện / etc / profile đang được đọc, chỉ cần thêm vào đầu tập tin lệnh này:
echo "'/etc/profile' is being read"
--login
tùy chọn. Đối với cái thứ hai, nếu tôiexec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"
nhận được (được mã hóa trong C qoutes)$'/etc/profile read\nshopt -s login_shell\nbash himBH'
thì đó là thông tin đăng nhập nhưng nó là tương tác. Chúng tôi cần đăng nhập và không tương tác . Tôi đang thiếu cái gì vậy?