Bumped vào một hành vi bất ngờ bash
/sh
và tôi tự hỏi ai đó có thể giải thích lý do đằng sau nó và cung cấp giải pháp cho câu hỏi bên dưới.Quá trình bẻ khóa 'trẻ em' của Bash khi thực hiện một lệnh đơn
Trong một phiên bash
vỏ tương tác, tôi thực hiện:
$ bash -c 'sleep 10 && echo'
Với ps
trên Linux nó trông như thế này:
\_ -bash \_ bash -c sleep 10 && echo \_ sleep 10
Cây quá trình là những gì tôi mong đợi:
- quá trình bash shell tương tác của tôi (
$
) - Một con shell quá trình (
bash -c ...
) - một giấc ngủ trẻ em xử lý
Tuy nhiên, nếu lệnh phần bash -c
của tôi là một đơn lệnh, ví dụ:
$ bash -c 'sleep 10'
Sau đó, sub-shell ở giữa bị nuốt chửng, và session terminal tương tác của tôi thực thi giấc ngủ "trực tiếp" như quá trình con. Cây quá trình trông như thế này:
\_ -bash \_ sleep 10
Vì vậy, từ góc độ cây quá trình, hai sản xuất cùng một kết quả:
$ bash -c 'sleep 10'
$ sleep 10
gì đang xảy ra ở đây?
Bây giờ với câu hỏi của tôi: có cách nào để buộc vỏ trung gian, bất kể sự phức tạp của biểu thức được chuyển đến bash -c ...
không?
(tôi có thể nối thêm một cái gì đó giống như ; echo;
lệnh thực tế của tôi và rằng "công trình", nhưng tôi không muốn Có cách nào thích hợp hơn để buộc các quá trình trung gian ra đời.?)
(chỉnh sửa: typo trong ps
đầu ra; loại bỏ sh
thẻ như đề xuất trong ý kiến; thêm một typo)
Tại sao bạn * không * muốn tối ưu hóa này khi nó có thể? –
Chủ yếu đảm bảo hành vi nhất quán khi xử lý các quy trình con trong môi trường nơi người dùng có thể chuyển các lệnh tùy ý. Tôi không chắc chắn bỏ qua tối ưu hóa này là giải pháp của tôi (vấn đề thực tế tôi đang có phải đối phó với một sự thay đổi của sudo: https://stackoverflow.com/a/34376188). Nhưng hành vi này rất thú vị và tôi muốn tìm hiểu thêm về nó. – Marco
Câu hỏi hay. Ý của bạn là nói '\ _ bash -c sleep 10 && echo' thay vì' \ _ bash -c sleep 10 && sleep 10' trên dòng 2 của cây ps đầu tiên của bạn? – codeforester