Người thực hiện 3 <& 1 làm gì?


13

Tôi hiểu rằng execcó thể chuyển hướng I / O trên shell hiện tại, nhưng tôi chỉ thấy cách sử dụng như:

exec 6<&0   # Link file descriptor #6 with stdin.
            # Saves stdin.

exec 6>&1   # Link file descriptor #6 with stdout.
            # Saves stdout.

Từ đó tôi hiểu rằng <dành cho luồng đầu vào, >dành cho luồng đầu ra. Vậy exec 3<&1làm gì?

PS: Tôi tìm thấy cái này từ mã nguồn của Dơi


@Gnouc rõ ràng là chính xác, nhưng cần lưu ý rằng exec 3<&1khác với 3<&1cái sau sẽ ảnh hưởng đến một lệnh duy nhất trong khi cái trước ảnh hưởng đến lớp vỏ hiện tại.
mikeerv

Câu trả lời:


14

Từ bash manpage:

Duplicating File Descriptors
       The redirection operator

              [n]<&word

       is used to duplicate input file descriptors.  If word expands to one or
       more  digits,  the file descriptor denoted by n is made to be a copy of
       that file descriptor.  If the digits in word  do  not  specify  a  file
       descriptor  open for input, a redirection error occurs.  If word evalu
       ates to -, file descriptor n is closed.  If n  is  not  specified,  the
       standard input (file descriptor 0) is used.

       The operator

              [n]>&word

       is  used  similarly  to duplicate output file descriptors.  If n is not
       specified, the standard output (file descriptor 1)  is  used.   If  the
       digits  in word do not specify a file descriptor open for output, a re
       direction error occurs.  As a special case, if n is omitted,  and  word
       does not expand to one or more digits, the standard output and standard
       error are redirected as described previously.

Tôi đã làm một số lỗi với strace:

sudo strace -f -s 200 -e trace=dup2 bash redirect.sh

Dành cho 3<&1:

dup2(3, 255)                            = 255
dup2(1, 3)                              = 3

Dành cho 3>&1:

dup2(1, 3)                              = 3

Dành cho 2>&1:

dup2(1, 2)                              = 2

Có vẻ như 3<&1thực hiện chính xác như 3>&1, sao chép thiết bị xuất chuẩn vào tệp mô tả 3.


Từ trang này, tôi hy vọng nó sẽ xuất hiện lỗi chuyển hướng vì thiết bị xuất chuẩn không mở cho đầu vào. Tuy nhiên, nó thực sự trùng lặp stdin (đó là & 0). Làm sao?
orion

2
@orion: Trong nội bộ, cùng một tòa nhà dup2()được sử dụng cho bất kỳ loại mô tả tệp nào; bash's x>&yvs x<&ychỉ là cú pháp đường. Ngoài ra, khi stdio được gắn vào tty, thiết bị tty thường được mở để đọc + ghi và chỉ được sao chép từ 0 đến 1 và 2.
user1686 20/03/14

@grawity vậy exec 3<&1có giống như exec >&3?
Zhenkai

Không, nhưng nó giống như exec 3>&1.
dùng1686
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.