Tôi đã quen với hàm bashdựng sẵn readtrong 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ố makedự á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 bashlà readdự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, cmd1và cmd4được thực hiện trong phạm vi tương tự, trong khi các lệnh cmd2và 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 đócmd2vàcmd3mỗi người được đưa ra một nhánh con riêngcmd1; cmd2 | cmd3; cmd4bằng cách thử những thứ nhưanswer=42 | sleep 0hoặ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).