Tôi cần đọc một số dữ liệu cấu hình vào các biến môi trường trong tập lệnh bash.bash coproc và sản lượng coproc còn sót lại
Các mô hình "rõ ràng" (nhưng không chính xác) là:
egrep "pattern" config-file.cfg | read VAR1 VAR2 VAR3 etc...
này thất bại vì read
được chạy trong một subshell và do đó không thể thiết lập các biến trong vỏ cách gọi. Vì vậy, tôi đã đưa ra điều này như một cách thay thế
coproc egrep "pattern" config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...
hoạt động tốt.
Để kiểm tra những gì sẽ xảy ra nếu coprocess trả về nhiều hơn một dòng, tôi đã cố gắng này:
coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...
nơi config-file.cfg
chứa ba dòng.
$ cat config-file.cfg
LINE1 A1 B1 C1
LINE2 A2 B2 C2
LINE3 A3 B3 C3
Tôi dự kiến điều này sẽ xử lý dòng đầu tiên trong tệp, theo sau là một số thông báo lỗi "đường ống bị hỏng". Trong khi nó đã làm xử lý dòng đầu tiên, không có thông báo lỗi và không có coprocess nào được chạy.
Vì vậy, tôi sau đó thử như sau trong một kịch bản:
$ cat test.sh
coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 VAR4
echo $VAR1 $VAR2 $VAR3 $VAR4
wait
echo $?
Chạy nó:
$ bash -x test.sh
+ read -u 63 VAR1 VAR2 VAR3 VAR4
+ cat config-file.cfg
LINE1 A1 B1 C1
+ wait
+ echo 0
0
đâu hai dòng còn lại đi đâu? Tôi đã có thể mong đợi hoặc là "đường ống bị hỏng", hoặc wait
để treo vì không có gì để đọc các dòng còn lại, nhưng như bạn có thể thấy mã trả về là số không.
Trừ khi tôi bỏ sót điều gì đó, một cái gì đó như 'đọc VAR1 VAR2 VAR3 <<(egrep" pattern "config-file.cfg)' sẽ đủ, phải không? –
@ShawnChin: đó là bỏ qua câu hỏi. Coprocs là những lý do chính đáng để giải thích rằng OP không phải giải thích trước tiên – sehe
Xin lỗi vì sự thiếu hiểu biết của tôi. Tôi thừa nhận coprocs là mát mẻ, nhưng bình luận là một phản ứng với một suy nghĩ đi qua rằng coprocs có thể là một overkill nếu nó chỉ đơn giản là để tránh 'đọc chạy trong một subshell và mất các vars. Tôi có thể nhầm lẫn, như thường lệ. –