Bash đọc lệnh và chuyển hướng stdin


8

Theo tôi hiểu tài liệu bash cả | và <chuyển hướng stdin. Vì vậy, cmd | foofoo < <(cmd)nên tương đương nhiều hay ít. Tuy nhiên, đối với lệnh đọc bash-Internal, điều này dường như không phải là trường hợp. Ví dụ, nếu tôi nhập

a=""; b=""; read a b < <(echo a b); echo $a $b

nó in ra a b, trong khi

a=""; b=""; echo a b | read a b; echo $a $b

in ra không có gì. Mặt khác, nếu tôi nhập

a=""; b=""; cat < <(echo a b) >foo1

a=""; b=""; echo a b | cat > foo2

các tập tin foo1 và foo2 hoàn toàn giống nhau. Vì vậy, câu hỏi của tôi là: sự khác biệt với cả hai hình thức khi lệnh đọc có liên quan (hoặc nói chung) là gì? Họ sẽ thấy chính xác đầu vào được chuyển hướng tương tự. Trong khi < <(...)biểu mẫu hoạt động, tôi thấy nó khá khó đọc và rất thích sử dụng biểu mẫu ống.


2
Hãy xem câu trả lời cho câu hỏi này .
larsks

Câu trả lời:


10

Hành động của đường ống thực hiện readtrong một lớp con, trong khi quá trình thay thế thì không. Đối với hầu hết các trường hợp sử dụng, đây không phải là vấn đề, nhưng trong trường hợp này bạn muốn ảnh hưởng trực tiếp đến trình bao (bằng cách thao tác các biến). Bởi vì readđã được gọi trong một subshell, chỉ có subshell bị ảnh hưởng. Như vậy, bất kỳ hành động nào bạn có thể muốn thực hiện trên chúng cũng sẽ cần phải được thực hiện trong phần con; ví dụ:

echo a b | { read a b ; echo "$a" "$b" ; }

Vâng, cảm ơn rất nhiều. Tôi đã không nghĩ về vấn đề này trước đây, nhưng điều này làm sáng tỏ mọi thứ. Bây giờ tôi cũng đã tìm thấy [ tldp.org/LDP/abs/html/gotchas.html#BADREAD[(this) trong Hướng dẫn viết kịch bản Bash nâng cao. Thay vào đó, họ khuyên bạn nên sử dụng lệnh [ tldp.org/LDP/abs/html/iternal.html#SETPOS[(set) để gán các giá trị cho các tham số vị trí.
Elmar Zander

2
@ElmarZander - Đừng sử dụng hướng dẫn Bash Scripting "Nâng cao" khét tiếng từ TLDP, nó sẽ dạy bạn viết các lỗi chứ không phải các tập lệnh. Có những nơi nó được viết xấu, và nhiều nơi khác chỉ đơn giản là sai. Tôi muốn giới thiệu BashGuide thay thế.
Chris Down
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.