Câu trả lời:
./myscript chạy myscript với bất cứ thông dịch viên nào được chỉ định trong shebang. myscript cần phải có tập bit thực thi.
bash ./myscript chạy myscript với bash. myscript không cần phải thực thi và vì bash được cung cấp một tệp để chạy, nên nó thậm chí không tìm kiếm nó trong PATH, vì vậy bash myscript sẽ làm việc tốt như vậy.
bash -c "./myscript" bắt đầu một cá thể bash để thực thi một lệnh, điều này xảy ra để làm cho nó thực thi ./myscript với bất kỳ trình thông dịch nào được chỉ định trong shebang (vì vậy nó tương tự như trường hợp đầu tiên, với quy trình bash được thêm vào). Đối số để bash -c là bất kỳ lệnh bash hoặc chuỗi lệnh nào (thử bash -c "echo 'aa';echo 'bb'" ).
Và bạn đã không đề cập đến . ./myscript
exec ./myscript đang thay thế shell hiện tại bằng script.
myscript là một đứa trẻ trực tiếp của vỏ của bạn. Trong trường hợp thứ ba, con trực tiếp của vỏ của bạn là bash lệnh mà bạn gọi, và nó sẽ sinh ra một cá thể bash khác để chạy myscript.
Giả định myscript có thể thực thi được và đang có một dòng shebang trỏ đến bash nhị phân - không có sự khác biệt giữa chạy ./myscript một mình hoặc bash ./myscript, nhưng đang chạy bash -c ./myscript đang tạo thêm một cấp độ subshell - mà bạn có thể thấy bằng cách kiểm tra SHLVL var ( bash terminal > running bash -c > running shebang line with bash 3 x bash)
Thông thường bạn đang ở trong một phiên bash terminal, khi thực hiện ./myscript đường dây shebang đang gọi bash và tạo ra một bash subshell trong đó nó đang chạy các lệnh.
30311 pts/0 Ss 0:00 -bash
8419 pts/0 S+ 0:00 \_ /bin/bash ./test.sh
8420 pts/0 R+ 0:00 \_ ps f
SHELL LEVEL: 2 # is 3 when running with bash -c
8419 # that's the $BASHPID
Lấy mã này dưới đây (test.sh) và tự mình thử.
#!/bin/bash
ps f
echo "SHELL LEVEL: $SHLVL"
echo $BASHPID
linux và bash dẫn đến giả định rằng kịch bản là một bash tập lệnh chạy trong một bash môi trường.