Giả sử tôi làm set -x
trong tập lệnh "a.sh" và nó gọi một tập lệnh khác "b.sh".Làm thế nào để cho phép bash subshell thừa kế các tùy chọn của cha mẹ?
Có thể để "b.sh" kế thừa tùy chọn -x
từ "a.sh" không?
Giả sử tôi làm set -x
trong tập lệnh "a.sh" và nó gọi một tập lệnh khác "b.sh".Làm thế nào để cho phép bash subshell thừa kế các tùy chọn của cha mẹ?
Có thể để "b.sh" kế thừa tùy chọn -x
từ "a.sh" không?
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
và ./b
$ echo "export SHELLOPTS; ./b" > a
$ bash -xv a
./b
+ ./b date
++ date
Sun Dec 29 21:34:36 EST 2013
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/ –
Đ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'' –
Đ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ó. –
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!
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ụ đó.
Vì -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
Sử dụng '.' hoặc' source' để gọi 'b.sh'. – devnull