"Được gọi là" đề cập đến bất cứ điều gì mà quá trình bắt đầu Bash đưa vào đối số dòng lệnh "zeroth" của nó , argv[0]
.
Khi một chương trình được bắt đầu với exec*()
syscalls , họ không thực sự làm quen với tên của tập tin nhị phân chứa các chương trình, nhưng thay vào đó là quá trình gọi là miễn phí để đặt bất cứ điều gì nó muốn ở đó. Tất nhiên, thông thường, tên được lấy từ hệ thống tập tin, vì vậy nếu bạn chạy /bin/sh
, đó là những gì được đặt ở đó. Và nếu /bin/sh
là Bash, nó không phải là một liên kết tượng trưng, nó có thể là một liên kết cứng hoặc chỉ là một bản sao khác của chương trình shell.
Như một ví dụ về việc đặt "tên chương trình", exec
lệnh của Bash có thể đặt đối số zeroth với -a
tùy chọn. (Chúng ta có thể làm tương tự với Perl hoặc trực tiếp với C, v.v.)
Đây myname
là một chương trình C đơn giản chỉ in đối số zeroth của nó, tên mà nó tự thấy:
$ ./myname
I am ./myname
$ (exec -a something ./myname )
I am something
$ mv ./myname somename
$ ln -s somename othername
$ ./somename
I am ./somename
$ ./othername
I am ./othername
Nguồn:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
Nhưng, để trả lời các câu hỏi được đánh số ...
(1 & 4) chạy sh somescript
sẽ chạy bất cứ thứ gì sh
có trên bạn PATH
, có thể /bin/sh
nhưng có thể là thứ gì đó như thế/usr/xpg4/bin/sh
.
- Nếu là Bash, nó chạy ở chế độ POSIX, vì nó nhìn thấy tên
sh
.
- Nếu là vỏ Z hoặc vỏ Korn, thì nó cũng nhìn thấy tên đó
sh
, nhưng nó chạy ở chế độ "tương thích SH", nhằm mục đích tương thích với vỏ Bourne và khác biệt với chế độ tuân thủ POSIX đầy đủ trong cả hai vỏ đó .
- Nó có thể là vỏ Almquist, vỏ Bourne thực tế, hoặc một cái gì đó khác, tất nhiên.
(2 & 5) Chạy bash somescript
sẽ chạy trong chế độ Bash thông thường (một lần nữa, tất nhiên nó phụ thuộc vào những gì bash
trong bạn PATH
.)
(3) Ở đây, tên của tập lệnh được đặt trực tiếp cho lệnh gọi hệ thống thay cho tệp chương trình. Nhân đọc dòng hashbang và sử dụng nó để chạy tập lệnh.
(6) Đây là một trong những phức tạp. Nó tương tự như (3), nhưng lệnh hệ thống để bắt đầu chương trình không thành công ( ENOEXEC (Exec format error)
), vì không có dòng hashbang. Chuyện gì xảy ra tiếp theo phụ thuộc từ liệu vỏ mà bạn đang chạy là bản thân trong chế độ POSIX. POSIX yêu cầu lớp vỏ phù hợp POSIX hoạt động theo kiểu cụ thể để đáp ứng ENOEXEC
. Tuy nhiên, có một số độ trễ trong "một lệnh tương đương với việc gọi shell" có nghĩa là các shell khác nhau làm những việc khác nhau.
- Shell Bourne Again tự chạy lại trong cùng chế độ với tên của tập lệnh là đối số dòng lệnh đầu tiên của nó. Trong chế độ tuân thủ POSIX, dĩ nhiên nó tự chạy ở chế độ tuân thủ POSIX, do đó tuân theo yêu cầu POSIX để gọi vỏ phù hợp POSIX.
- Shell Z, Almquist shell và Korn shell chạy
/bin/sh
với tên của tập lệnh được chèn trước các đối số khác làm đối số dòng lệnh đầu tiên của nó. Vỏ Z, vỏ Almquist và vỏ Korn (đang cố gắng) gọi vỏ phù hợp POSIX bằng cách giả định rằng /bin/sh
chương trình là một.