2013-07-25 7 views

Trả lời

20
export SHELLOPTS 

ví dụ:

echo date > b 
chmod +x b 

mà không xuất khẩu, chúng tôi chỉ nhìn thấy các lệnh trong ./a khi nó gọi ./b:

$ echo ./b > a 
$ bash -xv a 

./b 
+ ./b 
Sun Dec 29 21:34:14 EST 2013 

nhưng nếu chúng tôi xuất khẩu SHELLOPTS, chúng tôi xem các lệnh trong ./a./b

$ echo "export SHELLOPTS; ./b" > a 
$ bash -xv a 

./b 
+ ./b date 
++ date 
Sun Dec 29 21:34:36 EST 2013 
+0

Than ôi, "các chỉnh sửa phải có ít nhất 6 ký tự" nên tôi không thể sửa bài đăng trực tiếp. Ví dụ tốt về cách thức, trong lập trình, một sự thay đổi một nhân vật có thể là "đáng kể" đủ để tiết kiệm cho người đọc rất nhiều đau đớn./SHELLOPT [^ S]/s/SHELLOPT/SHELLOPTS/ –

+0

Điều này không làm việc cho 'set -e' và subshell trong' $ (...) ':' bash4 -c 'set -eC; set -o pipefail; xuất khẩu SHELLOPTS; f() {false; echo hi; }; foo = (thanh "$ (f)"); echo end'' trong khi beahvior với '$ (set -e; ...)' rõ ràng là khác: 'bash4 -c 'set -eC; set -o pipefail; f() {false; echo hi; }; foo = (bar "$ (set -e; f)"); echo end'' –

+0

Điều này thật tuyệt, nhưng làm thế nào để bạn có thể nhận được 'PS4'? Tôi đã xuất nó. –

0

Chúng sẽ được kết hợp trong tập lệnh b nếu tập lệnh b sources tập lệnh a. Mà có thể hoặc không thể giải quyết vấn đề của bạn cho bạn!

+0

Cảm ơn câu trả lời của bạn, nhưng sau đó b sẽ không phải là một subshell. Bạn có biết một cách khi bạn thực hiện nó như là một lệnh thay vì tìm nguồn cung ứng nó? – dspjm

+0

@dspjm Nó không thể xảy ra trong một subshell. – devnull

0

Giống như @devnull cho biết bạn có thể sử dụng hoạt động . trong tập lệnh của mình.

Trong a.sh

. SETVALUES

Trong b.sh

. SETVALUES

Trong SETVALUES

set -x

đâu bao giờ bạn gọi SET GIÁ TRỊ, các giá trị đó sẽ được đặt trong vỏ phụ đó.

3

-x không được thừa kế bởi subshells, bạn cần phải rõ ràng hơn một chút. Bạn có thể kiểm tra khi -x được sử dụng với thông số đặc biệt $-.

if [[ $- = *x* ]]; then 
    # Set the option, then *source* the script, in a subshell 
    (set -x; . b.sh) 
else 
    # Simply run the script; subshell automatically created. 
    ./b.sh 
fi