3> & 1 có nghĩa là 4> & 3 5> & 3, v.v.?


31

Tôi mong đợi

echo foo | tee /proc/self/fd/{3..6} 3>&1

không thành công với các lỗi như / Proc / self / fd / 4: Không có tệp hoặc thư mục như vậy, v.v., nhưng thật ngạc nhiên, nó xuất ra

foo
foo
foo
foo
foo

Nó giống như 3>&1làm cho tất cả các mô tả sau được chuyển hướng đến thiết bị xuất chuẩn, ngoại trừ nó không hoạt động nếu tôi đổi 3sang thứ khác, như

$ echo foo | tee /proc/self/fd/{3..6} 4>&1
tee: /proc/self/fd/3: No such file or directory
tee: /proc/self/fd/5: No such file or directory
tee: /proc/self/fd/6: No such file or directory
foo
foo
$ echo foo | tee /proc/self/fd/{4..6} 4>&1
tee: /proc/self/fd/5: No such file or directory
tee: /proc/self/fd/6: No such file or directory
foo
foo

Có một lời giải thích cho hành vi này?

Câu trả lời:


31

strace hiển thị chuỗi các cuộc gọi hệ thống này:

$ strace -o strace.log tee /proc/self/fd/{3..6} 3>&1
...
$ cat strace.log
...
openat(AT_FDCWD, "/proc/self/fd/3", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
openat(AT_FDCWD, "/proc/self/fd/4", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 5
openat(AT_FDCWD, "/proc/self/fd/5", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6
openat(AT_FDCWD, "/proc/self/fd/6", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 7
...

Dòng đầu tiên mở /proc/self/fd/3và gán cho nó số fd có sẵn tiếp theo, 4. /proc/self/fd/3là một đường dẫn đặc biệt. Mở nó có hiệu ứng tương tự như dup ing fd 3: fd 4 điểm đến cùng một vị trí với fd 3, tty.

Điều tương tự xảy ra cho mỗi openat()cuộc gọi liên tiếp . Khi bụi lắng xuống fds 4, 5, 6 và 7 đều là bản sao của fd 3.

  • 1 → tty
  • 3 → tty
  • 4 → tty
  • 5 → tty
  • 6 → tty
  • 7 → tty

Lưu ý rằng việc 3>&1chuyển hướng không quan trọng. Điều quan trọng là chúng tôi yêu cầu tee mở /proc/self/fd/Nnơi N đã được sử dụng. Chúng ta sẽ nhận được kết quả tương tự nếu chúng ta thoát khỏi 3>&1/proc/self/fd/2thay vào đó bắt đầu tee . Hãy xem nào:

$ echo foo | tee /proc/self/fd/{2..6}
foo
foo
foo
foo
foo
foo

Đã xác nhận! Cùng một kết quả.

Chúng ta cũng có thể lặp đi lặp lại cùng một số fd. Chúng tôi nhận được kết quả tương tự khi chúng tôi đạt fd 6. Vào thời điểm cuối cùng, nó đã mở đủ các mô tả để thực hiện bước nhảy lên 6.

$ echo foo | tee /proc/self/fd/{2,2,2,2,6}
foo
foo
foo
foo
foo
foo
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.