'Exec {fd} </ dev / watchdog' làm gì ở Bash


28

Đó 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:


34

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

Tôi chắc chắn rằng bạn đã đúng, bởi vì (1) Tôi nhớ đã đọc nó ở đâu đó và (2) Tôi vừa thử nó (và nó hoạt động). Nhưng tôi không thể tìm thấy nó được ghi nhận ở bất cứ đâu. (Tất nhiên, tôi có ít hơn mười phút để tìm kiếm trước khi bạn đăng câu trả lời của mình.) Bạn có thể cung cấp một tài liệu tham khảo về nơi nó được ghi lại không?
Scott

2
Xem trang người đàn ông, đoạn 2 của phần 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.
chepner

Bạn nói đúng, tôi đã bỏ lỡ nó trong bash man, nhưng đó là nơi bạn nói. Cần lưu ý rằng bất kỳ từ nào, không chỉ fd sẽ hoạt động trong dấu ngoặc nhọn và nó gán một fd> = 10.
Gregg Leventhal

3
@Scott, không chỉ trong bash, mà nó chỉ có trong bash 4.1 hoặc mới hơn (do đó không có sẵn trên các bản phát hành 3.2 vẫn được sử dụng trên MacOS).
Charles Duffy

2
@CharlesDuffy /dev/watchdogcũ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.
duskwuff

11

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), bashsao chép nó rất nhiều sau này trong bash-4.1-alphatừ năm 2010. zshcũng thực hiện thay đổi sớm hơn bashtừ zsh 4.3.4năm 2007.


2

Đ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ừ >&-<&-, 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.

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.