Chạy các chế độ bash script


0

Sự khác biệt giữa chạy là gì:

:~$./myscript

:~$bash ./myscript

:~$bash -c "./myscript"

(giả định ./myscript là thực thi)?


Không có gì nhiều ngoại trừ người thứ hai sẽ không tôn vinh dòng shebang
Eric Renouf

Câu trả lời:


2

./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


hoặc là exec ./myscript đang thay thế shell hiện tại bằng script.
Michael D.

@xenoid Ý bạn là gì khi "thêm quy trình bash"?
Mulligan

Trong trường hợp đầu tiên, trình thông dịch bash chạy 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.
xenoid

@ Vì vậy, lợi thế của việc sử dụng cả 3 giải pháp này là gì?
Mulligan

Không có lý do chính đáng để sử dụng AFAIK thứ ba. Thứ hai sẽ được sử dụng để ghi đè lên shebang hoặc vì chưa có shebang. Người đầu tiên là người kinh điển.
xenoid

0

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

Sẽ có một sự khác biệt nếu shebang trỏ đến một shell khác (zsh, hoặc thậm chí / bin / sh có thể không bị bash trong một số trường hợp)
xenoid

Câu hỏi được gắn thẻ linuxbash 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.
Michael D.

Đó là về lệnh bash, vâng, nhưng giả sử tập lệnh có nghĩa là bash là một lỗi thường xảy ra trong thực tế. Nhiều tập lệnh trong các sản phẩm cho máy chủ được viết cho ksh, được coi là không hợp nhất (Solaris, AIX, BSD ...).
xenoid

Vâng, nó có thể là một kịch bản python là tốt.
Michael D.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.