Là một vỏ con giống như vỏ con


11

Có hai tên này: a subshell và một đứa trẻ vỏ .

Có, một quá trình con sẽ được bắt đầu bởi bất kỳ điều này:

sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat

Có phải tất cả đều tương đương và chia sẻ cùng tên? Có phải tất cả đều có chung đặc tính?


POSIX có định nghĩa này :

Một môi trường thực thi shell bao gồm ....

Nhưng đoạn cuối của liên kết trên có điều này:

Một môi trường lớp con sẽ được tạo như một bản sao của môi trường shell, ngoại trừ các bẫy tín hiệu không bị bỏ qua sẽ được đặt thành hành động mặc định.

Và đặc biệt:

Thay thế lệnh, các lệnh được nhóm với dấu ngoặc đơn và danh sách không đồng bộ sẽ được thực thi trong môi trường lớp con. Ngoài ra, mỗi lệnh của một đường ống đa lệnh nằm trong môi trường mạng con; ....

Các sh -c 'echo "Hello"'không được bao gồm ở đó, mà nên được gọi là một subshell cũng?

Câu trả lời:


14

Một subshell nhân đôi shell hiện có. Nó có cùng các forkbiến¹ , cùng chức năng, cùng tùy chọn, v.v ... Dưới mui xe, một lớp con được tạo với call² hệ thống; quá trình con tiếp tục làm những gì được mong đợi trong khi cha mẹ chờ đợi (ví dụ, $(…)) hoặc tiếp tục với cuộc sống của nó (ví dụ, … &) hoặc làm những gì được mong đợi về nó (ví dụ, … | …).

sh -c …không tạo ra một subshell. Nó ra mắt một chương trình khác. Chương trình đó là một cái vỏ, nhưng đó chỉ là sự trùng hợp. Chương trình thậm chí có thể là một trình bao khác (ví dụ: nếu bạn chạy sh -c …từ bash và shdash), tức là một chương trình hoàn toàn khác chỉ xảy ra có sự tương đồng đáng kể trong hành vi của nó. Trong mui xe, khởi chạy một lệnh bên ngoài ( shhoặc bất kỳ lệnh nào khác) gọi cuộc gọi forkhệ thống và sau đó execvegọi hệ thống để thay thế chương trình shell trong quy trình con bằng một chương trình khác (tại đây sh).

¹ Bao gồm $$, nhưng không bao gồm một số biến vỏ cụ thể như bash và của mksh BASHPID.
² Ít nhất, đó là cách thực hiện truyền thống và thông thường. Shell có thể tối ưu hóa ngã ba nếu họ có thể bắt chước hành vi khác.

Các trang người đàn ông có liên quan: ngã ba (2) , thực hiện (2) .


Cảm ơn. Việc chạy tập lệnh bash với bash shebang thuộc về cái gì?
Tim

@Tim Tương tự như sh -c: đó là một quy trình con tình cờ là một vỏ.
Gilles 'SO- ngừng trở nên xấu xa'

(1) "khởi chạy một lệnh bên ngoài (sh hoặc bất kỳ lệnh nào khác) gọi cuộc gọi hệ thống ngã ba và sau đó gọi hệ thống thực thi để thay thế chương trình shell trong quy trình con bằng một chương trình khác (ở đây sh)." Có đúng là trước tiên fork tạo ra một subshell và sau đó thực hiện thay thế subshell với chương trình bên ngoài? Vì vậy, trong hai trường hợp trong câu trả lời của bạn, một subshell luôn được tạo ra? (2) "Một lớp con nhân đôi lớp vỏ hiện có." điều đó nghĩa là gì?
Tim

(3) trong bash -c <command>, sau khi rẽ nhánh shell và sau đó thực thi bash -c <command>, một bash shell được tạo. Sau đó, cuộc gọi hệ thống được sử dụng để chạy <command>lại fork bash shell và thực thi <command>?
Tim

2
@cuonglm Ngôi nhà con Vỏ trẻ không phải là một thuật ngữ kỹ thuật với ý nghĩa cụ thể, không giống như Subshell. Nếu đó là một cái vỏ đó là một đứa trẻ, thì đó là một cái vỏ con, tuân theo các quy tắc thông thường của tiếng Anh.
Gilles 'SO- ngừng trở nên xấu xa'

1

Một môi trường shell phụ không cần phải sống trong một tiến trình riêng biệt, nó chỉ cần nhân đôi môi trường thực thi hiện tại. Trong ksh93này được thực hiện bởi một virtual sub-shellcơ chế không gọi fork(). Điều này làm cho ksh93 rất nhanh trên các nền tảng cổ xưa như Win-DOS, Win-DOScực kỳ chậm với việc giả mạo.

sh -c cmd mặt khác tạo ra một quy trình mới với vỏ mặc định không cần giống với vỏ tương tác hiện tại của bạn.

Ngay cả khi shvà vỏ hiện tại của bạn giống hệt nhau, điều này không trùng lặp môi trường thực thi và do đó không tạo ra một sub-shell.


Vì vậy, trong các shell khác ngoại trừ ksh93, subshell là shell con phải không?
cuonglm

Tôi biết không có triển khai nào khác thực hiện các mạng con ảo ngày hôm nay.
schily
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.