Đó là nghĩa đen, {fd}
không phải là một giữ chỗ. Tôi có một tập lệnh thực hiện điều này và không có nguồn trong bất cứ điều gì, cũng không tham chiếu {fd} ở bất kỳ nơi nào khác. Đây có phải là bash hợp lệ?
exec {fd}</dev/watchdog
Đó là nghĩa đen, {fd}
không phải là một giữ chỗ. Tôi có một tập lệnh thực hiện điều này và không có nguồn trong bất cứ điều gì, cũng không tham chiếu {fd} ở bất kỳ nơi nào khác. Đây có phải là bash hợp lệ?
exec {fd}</dev/watchdog
Câu trả lời:
Thay vì phải chọn một bộ mô tả tệp và hy vọng nó có sẵn:
exec 4< /dev/watchdog # Was 4 in use? Who knows?
ký hiệu này yêu cầu shell chọn một bộ mô tả tệp hiện không được sử dụng, mở tệp để đọc trên bộ mô tả đó và gán số cho biến đã cho ( fd
).
$ exec {fd}< /dev/watchdog
$ echo $fd
10
REDIRECTIONS
. Nó không thực sự nhảy ra khỏi bạn, vì họ không đưa ra một ví dụ rõ ràng.
/dev/watchdog
cũng không tồn tại trên Mac OS X; nó là một thiết bị dành riêng cho Linux.
Hình thức:
{var}<filename
làm cho shell mở tập tin filename
để đọc và lưu trữ số mô tả tập tin trong biến var
. Không có khoảng trống được phép giữa các {var}
toán tử chuyển hướng và số mô tả tệp sẽ lớn hơn hoặc bằng 10
.
Tính năng này là gốc từ ksh
(từ phiên bản ksh93r năm 2006), bash
sao chép nó rất nhiều sau này trong bash-4.1-alpha
từ năm 2010. zsh
cũng thực hiện thay đổi sớm hơn bash
từ zsh 4.3.4
năm 2007.
Điều này được giải thích trong phần hướng dẫn Bash về Chuyển hướng .
Mỗi chuyển hướng có thể được đi trước bởi một số mô tả tệp thay vào đó có thể được đi trước bởi một từ có dạng { varname }. Trong trường hợp này, đối với mỗi toán tử chuyển hướng ngoại trừ
>&-
và<&-
, trình bao sẽ phân bổ một bộ mô tả tệp lớn hơn 10 và gán nó cho { varname }. Nếu>&-
hoặc<&-
đứng trước { varname }, giá trị của varname xác định bộ mô tả tệp sẽ đóng.