Để đọc từ mô tả tập tin 6 tôi có thể sử dụng <&6
hoặc </dev/fd/6
(aka /proc/self/fd/6
). Thông thường cả hai đều làm việc tốt như nhau. Tuy nhiên, nếu mô tả tập tin đó là một ổ cắm, điều kỳ lạ xảy ra. Ví dụ:
$ bash -c 'ls -l /dev/fd/6;cat /dev/fd/6' 6</dev/tcp/localhost/12345
lrwx------ 1 michas michas 64 Jan 10 19:50 /dev/fd/6 -> socket:[315010]
cat: /dev/fd/6: No such device or address
Ở đây ls
cho thấy các mô tả là thực sự hiện diện. Nhưng truy cập dữ liệu là không thể theo cách này. Nếu tôi sử dụng cat <&6
thay vì mọi thứ hoạt động tốt trở lại.
Sự khác biệt giữa cả hai cách truy cập mô tả tập tin là gì?
Có một cách tốt để truy cập một mô tả nếu số nếu được đưa ra trong một biến? ( </dev/fd/$fd
sẽ làm việc, nhưng <&$fd
không.)
(Tình huống trên có thể được quan sát trên linux, nhưng không phải trên OpenBSD. - Có vẻ như mô tả tệp đó là một thiết bị ký tự thông thường ở đó.)