Tôi đã quen với hàm bash
dựng sẵn read
trong các vòng lặp, ví dụ:
echo "0 1
1 1
1 2
2 3" |\
while read A B; do
echo $A + $B | bc;
done
Tôi đã làm việc trên một số make
dự án và việc phân chia các tệp và lưu trữ các kết quả trung gian trở nên khôn ngoan. Kết quả là tôi thường kết thúc việc chia các dòng đơn thành các biến. Trong khi ví dụ sau hoạt động khá tốt,
head -n1 somefile | while read A B C D E FOO; do [... use vars here ...]; done
thật là ngu ngốc, bởi vì vòng lặp while sẽ không bao giờ chạy nhiều hơn một lần. Nhưng không có while
,
head -n1 somefile | read A B C D E FOO; [... use vars here ...]
Các biến đọc luôn trống khi tôi sử dụng chúng. Tôi không bao giờ nhận thấy hành vi này read
, bởi vì tôi thường sử dụng các vòng lặp để xử lý nhiều dòng tương tự. Làm thế nào tôi có thể sử dụng bash
là read
dựng sẵn mà không cần một thời gian vòng lặp? Hoặc có cách nào khác (hoặc thậm chí tốt hơn) để đọc một dòng thành nhiều biến (!) Không?
Phần kết luận
Các câu trả lời dạy chúng tôi, đó là một vấn đề phạm vi. Tuyên bố
cmd0; cmd1; cmd2 | cmd3; cmd4
được giải thích như vậy mà lệnh cmd0
, cmd1
và cmd4
được thực hiện trong phạm vi tương tự, trong khi các lệnh cmd2
và cmd3
đang từng đưa subshell riêng của họ, và phạm vi do khác nhau. Shell ban đầu là cha mẹ của cả hai subshells.
… cmd1; | cmd2 …
là một lỗi. (2) Chúng ta có thể nói điều đócmd2
vàcmd3
mỗi người được đưa ra một nhánh con riêngcmd1; cmd2 | cmd3; cmd4
bằng cách thử những thứ nhưanswer=42 | sleep 0
hoặccd other/dir | read foo
. Bạn sẽ thấy rằng lệnh đầu tiên trong mỗi đường ống phải nằm trong một lớp con, vì chúng không ảnh hưởng đến quá trình shell chính (cha).