2010-03-31 35 views
19

Hãy tưởng tượng tôi có một kịch bản bash, nơi tôi gọi đây là:Có thể lấy mã thoát khỏi một vỏ bọc không?

bash -c "some_command" 
do something with code of some_command here 

Có thể lấy mã của some_command? Tôi không thực hiện trực tiếp some_command trong shell chạy script vì tôi không muốn thay đổi môi trường của nó.

+0

Tôi không chắc chắn về lý do của bạn để thực thi gián tiếp - rằng vỏ con thừa hưởng môi trường từ tập lệnh gọi. Chỉ cần thử 'export FOO =" foo "; bash -c 'echo $ FOO'' (dấu nháy đơn để nó không được mở rộng cho đến khi subshell chạy nó). – Cascabel

+2

Nó kế thừa môi trường, nhưng nó sẽ không thay đổi môi trường cho trình bao hiện tại. Bất kỳ sửa đổi nó sẽ làm cho env. vars sẽ biến mất khi nó chết. – Geo

+0

Nếu bạn muốn chạy một cái gì đó mà không mucking lên vỏ mẹ sau đó tôi muốn sử dụng một subshell, http://tldp.org/LDP/abs/html/subshells.html – slm

Trả lời

22

$? sẽ chứa mã trả về là some_command như thường lệ.

Tất nhiên nó cũng có thể chứa mã từ bash, trong trường hợp xảy ra sự cố trước khi lệnh của bạn thậm chí có thể được thực hiện (tên tệp sai, không có gì).

6

Bạn có thể sử dụng biến số $?, xem tài liệu bash để biết điều này, nó lưu trữ trạng thái thoát của lệnh cuối cùng.

Ngoài ra, bạn có thể muốn kiểm tra các khối lệnh kiểu dấu ngoặc đơn (ví dụ: comm1 && (comm2 || comm3) && comm4), chúng luôn được thực thi trong một vỏ con sao cho không thay đổi môi trường hiện tại và mạnh mẽ hơn! EDIT: Ví dụ, khi sử dụng khối() kiểu so với lệnh bash -c ', bạn không phải lo lắng về việc thoát khỏi bất kỳ chuỗi ký tự đối số nào bằng dấu cách hoặc bất kỳ cú pháp shell đặc biệt nào khác. Bạn trực tiếp sử dụng cú pháp shell, đó là một phần bình thường của phần còn lại của mã.

+3

Nói cách khác, '(some_command)' thay vì 'bash -c" some_command "' –

18

Dưới đây là một minh chứng $? và ngoặc subshell đề cập bởi PaggasMatti:

$ (exit a); echo $? 
-bash: exit: a: numeric argument required 255 
$ (exit 33); echo $? 
33 

Trong trường hợp đầu tiên, mã này là một lỗi Bash và trong trường hợp thứ hai đó là mã thoát của exit.

+0

Bạn không có nghĩa là '$ (…)', và không phải '$ (…)'? Cái sau không chỉ không hợp lệ, mà còn rất khó hiểu. – Evi1M4chine

+4

@ Evi1M4chine: Ký hiệu đô la là dấu nhắc trong trường hợp này. Nó không có nghĩa là để được đánh máy. Các dấu ngoặc đơn trống thiết lập một subshell như đã đề cập trong câu trả lời của tôi, ans cho phép bạn lấy mã thoát và không thực sự thoát khỏi shell chính. –

+1

Ah. Vẫn làm mọi thứ khó hiểu. Không phải lỗi của bạn mặc dù dấu nhắc chuẩn giống như chỉ báo biến. :) – Evi1M4chine

Các vấn đề liên quan