<Trước | Nội dung | Tiếp theo>
Quy trình thay thế
Mặc dù chúng trông giống nhau và cả hai đều có thể được sử dụng để kết hợp các luồng nhằm chuyển hướng, nhưng có một sự khác biệt quan trọng giữa các lệnh nhóm và các trang con. Trong khi một hợp đồng nhóm thực thi tất cả các lệnh của nó trong trình bao hiện tại, thì một vỏ con (như tên cho thấy) thực thi các lệnh của nó trong một bản sao con của trình bao hiện tại. Điều này có nghĩa là môi trường được sao chép và cấp cho một phiên bản mới của trình bao. Khi vỏ con thoát ra, bản sao của môi trường sẽ bị mất, vì vậy bất kỳ thay đổi nào được thực hiện đối với môi trường của vỏ con (bao gồm cả việc gán biến) cũng sẽ bị mất. Do đó, trong hầu hết các trường hợp, trừ khi một tập lệnh yêu cầu một vỏ con, các lệnh nhóm sẽ được ưu tiên hơn các biểu mẫu con. Các lệnh nhóm nhanh hơn và yêu cầu ít bộ nhớ hơn.
Chúng tôi đã xem một ví dụ về vấn đề môi trường vỏ con trong Chương 28, khi chúng tôi phát hiện ra rằng một đọc lệnh trong một đường ống không hoạt động như chúng ta có thể mong đợi bằng trực giác. Tóm lại, nếu chúng ta xây dựng một đường dẫn như thế này:
echo "foo" | đọc echo $ REPLY
echo "foo" | đọc echo $ REPLY
Nội dung của ĐÁP LẠI biến luôn trống vì đọc lệnh được giải thích trong một vỏ con và bản sao của nó ĐÁP LẠI bị phá hủy khi kết thúc vỏ con.
Bởi vì các lệnh trong đường ống luôn được thực hiện trong các hộp con, bất kỳ lệnh nào ký hiệu các biến sẽ gặp phải vấn đề này. May mắn thay, shell cung cấp một dạng mở rộng kỳ lạ được gọi là quá trình thay thế có thể được sử dụng để giải quyết vấn đề này.
Sự thay thế quy trình được thể hiện theo hai cách: Đối với các quy trình tạo ra đầu ra tiêu chuẩn:
<( )
hoặc, đối với các quy trình lấy đầu vào tiêu chuẩn:
>( )
Ở đâu là một danh sách các lệnh.
Để giải quyết vấn đề của chúng tôi với đọc, chúng tôi có thể sử dụng thay thế quy trình như thế này:
đọc <<(echo "foo") echo $ REPLY
đọc <<(echo "foo") echo $ REPLY
Thay thế quy trình cho phép chúng tôi coi đầu ra của vỏ con như một tệp thông thường cho các mục đích chuyển hướng. Trên thực tế, vì nó là một dạng mở rộng, chúng ta có thể kiểm tra giá trị thực của nó:
[me @ linuxbox ~] $ echo <(echo "foo")
/ dev / fd / 63
[me @ linuxbox ~] $ echo <(echo "foo")
/ dev / fd / 63
Bằng cách sử dụng bỏ lỡ để xem kết quả của việc mở rộng, chúng tôi thấy rằng đầu ra của vỏ con đang được cung cấp bởi một tệp có tên / dev / fd / 63.
Thay thế quy trình thường được sử dụng với các vòng lặp chứa đọc. Đây là một ví dụ về một
vòng lặp đọc xử lý nội dung của một danh sách thư mục được tạo bởi một vỏ con:
#! / bin / bash
# pro-sub: bản trình diễn thay thế quy trình
trong khi đọc đính kèm liên kết chủ sở hữu nhóm kích thước ngày giờ tên tệp; làm mèo << - EOF
Tên tệp: $ filename Kích thước: $ size
Chủ sở hữu: $ chủ sở hữu
Nhóm: $ group Đã sửa đổi: $ date $ time Liên kết: $ links Thuộc tính: $ attr
EOF
xong <<(ls -l | tail -n +2)
#! / bin / bash
# pro-sub: bản trình diễn thay thế quy trình
trong khi đọc đính kèm liên kết chủ sở hữu nhóm kích thước ngày giờ tên tệp; làm mèo << - EOF
Tên tệp: $ filename Kích thước: $ size
Chủ sở hữu: $ chủ sở hữu
Nhóm: $ group Đã sửa đổi: $ date $ time Liên kết: $ links Thuộc tính: $ attr
EOF
xong <<(ls -l | tail -n +2)
Vòng lặp thực thi đọc cho mỗi dòng của danh sách thư mục. Danh sách chính nó được tạo ra trên dòng cuối cùng của tập lệnh. Dòng này chuyển hướng đầu ra của quá trình thay thế thành đầu vào chuẩn của vòng lặp. Các đuôi lệnh được đưa vào quy trình thay thế quy trình để loại bỏ dòng đầu tiên của danh sách, dòng không cần thiết.
Khi được thực thi, tập lệnh sẽ tạo ra đầu ra như sau:
[tôi @ linuxbox ~] $ pro-sub | đầu -n 20
Tên tệp: address.ldif Kích thước: 14540
Chủ sở hữu: tôi
Nhóm: tôi
Modified: 2009-04-02 11:12
[tôi @ linuxbox ~] $ pro-sub | đầu -n 20
Tên tệp: address.ldif Kích thước: 14540
Chủ sở hữu: tôi
Nhóm: tôi
Modified: 2009-04-02 11:12
Liên kết:
1
Liên kết:
Các thuộc tính: -rw-r - r--
Tên tệp: bin
Kích thước: 4096
Chủ sở hữu: tôi
Nhóm: tôi
Modified: 2009-07-10 07:31
Liên kết: 2
Các thuộc tính: drwxr-xr-x
Tên tệp: bookmarks.html Kích thước: 394213
Chủ sở hữu: tôi
Nhóm: tôi
Các thuộc tính: -rw-r - r--
Tên tệp: bin
Kích thước: 4096
Chủ sở hữu: tôi
Nhóm: tôi
Modified: 2009-07-10 07:31
Liên kết: 2
Các thuộc tính: drwxr-xr-x
Tên tệp: bookmarks.html Kích thước: 394213
Chủ sở hữu: tôi
Nhóm: tôi
<Trước | Nội dung | Tiếp theo>