Đó là một tính năng tài liệu.
Nếu bạn chạy bash thông qua một liên kết tượng trưng có tên sh
, bash sẽ bắt đầu ở sh
chế độ tương thích.
Từ man bash
:
Nếu bash được gọi với tên sh, nó sẽ cố gắng bắt chước hành vi khởi động của các phiên bản lịch sử của sh càng gần càng tốt, đồng thời tuân thủ tiêu chuẩn POSIX. Khi được gọi dưới dạng vỏ đăng nhập tương tác hoặc vỏ không tương tác với tùy chọn --login, trước tiên, nó sẽ cố gắng đọc và thực thi các lệnh từ / etc / profile và ~ / .profile, theo thứ tự đó. Tùy chọn --noprofile có thể được sử dụng để ức chế hành vi này. Khi được gọi dưới dạng shell tương tác với tên sh, bash tìm biến ENV, mở rộng giá trị của nó nếu nó được xác định và sử dụng giá trị mở rộng làm tên của tệp để đọc và thực thi. Do shell được gọi là sh không cố đọc và thực thi các lệnh từ bất kỳ tệp khởi động nào khác, nên tùy chọn --rcfile không có hiệu lực. Một vỏ không tương tác được gọi với tên sh không cố đọc bất kỳ tệp khởi động nào khác. Khi được gọi là sh, bash sẽ chuyển sang chế độ posix sau khi các tệp khởi động được đọc.
Làm thế nào để một chương trình biết tên đã được sử dụng để bắt đầu nó?
Nếu nó là chương trình ac, nó có thể kiểm tra argv[0]
. Nếu nó là một kịch bản shell hoặc perl, nó có thể kiểm tra $0
.
Ví dụ, hãy xem xét kịch bản shell đơn giản này:
$ cat utc
#!/bin/sh
case "${0##*/}" in
utc) date -u ;;
et) TZ=US/Eastern date ;;
esac
$0
là tên mà kịch bản được gọi bởi. ${0##*/}
là tên mà đoạn script được gọi với bất kỳ tên thư mục nào bị xóa.
Hãy tạo liên kết tượng trưng này:
ln -s utc et
Vì vậy, utc
và et
cả hai đều chạy cùng thực thi nhưng chúng cung cấp kết quả khác nhau. Khi chạy như utc
, nó xuất ra thời gian phổ quát. Khi chạy như et
, là đầu ra theo giờ miền Đông Hoa Kỳ. Ví dụ:
$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016