2010-02-26 14 views
32

Quick one, 2>&1 chuyển hướng stderr thành stdout, nhưng ký hiệu và nghĩa là gì? Tôi biết nếu chúng tôi có 2 > 1, nó sẽ xuất ra một tệp có tên là 1, thì ký hiệu và ký hiệu là gì?Dấu và ký hiệu chỉ ra trong lệnh bash này 1> & 2

+0

có thể trùng lặp của (http://stackoverflow.com/questions/818255/in-the-shell-what -oes-21-mean) –

Trả lời

16

Nó sao chép tập tin mô tả từ 1 tới tập tin mô tả 2. FD2 là stderr và stdout fd1 là, vì vậy nó làm cho bất kỳ đầu ra để stderr đi stdout để thay thế.

+1

Cảm ơn, vì vậy & có nghĩa là đầu ra để tập tin desciptor thay vì tập tin – mikip

+1

Nó thao tác của các mô tả tập tin. –

55

2>&1 chuyển hướng lỗi chuẩn (tệp xử lý 2) sang cùng một tệp mà đầu ra tiêu chuẩn (xử lý tệp 1) là hiện tại là.

Nó cũng là một điều vị trí phụ thuộc vào vậy:

prog >x 2>&1 >y 

sẽ thực sự gửi sai số chuẩn để x và đầu ra tiêu chuẩn để y như sau:

  • Connect chuẩn đầu ra để x;
  • Sau đó, kết nối lỗi tiêu chuẩn giống với đầu ra tiêu chuẩn hiện tại, là x;
  • Sau đó, kết nối đầu ra tiêu chuẩn với y;
+2

Tôi sẽ upvote điều này nhiều lần nếu tôi có thể. Tôi đã khó hiểu điều này, và lời giải thích của bạn về tầm quan trọng của * thứ tự * rõ ràng hơn tài liệu bash hiện tại: http://www.gnu.org/software/bash/manual/bashref.html#Redirections. Cảm ơn! – FMc

+1

Điều này tổng hợp mọi thứ! Trong 8 năm sử dụng Linux, không ai giải thích điều này một cách rõ ràng! Cảm ơn bạn đời. –

6

Từ info bash:

3.6.7 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 
evaluates 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 
redirection 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. 

Vì vậy 2>&1 bản sao fd 1 vào fd 2.

16

Ký hiệu và thuộc về "1", do đó đoạn mã thực sự có ba phần: "2", ">", "& 1". Họ có nghĩa là, tương ứng, "lấy dữ liệu từ luồng đầu ra 2 (là lỗi chuẩn)", "chuyển hướng nó", và mục tiêu chuyển hướng, là luồng đầu ra 1. Vì vậy, "&" ở đây cho phép bạn chuyển hướng đến luồng hiện tại , thay vì tập tin.

0

dấu và không làm bất cứ điều gì - đó là ký tự trong toán tử 2>&1 chứ không phải là một điều theo đúng nghĩa của nó.

bash hỗ trợ một số redirection operators, toán tử 2>&1 hoặc toán tử &> kết hợp các luồng của quy trình trước hoặc sau khi chuyển hướng.

12

& trong &1 sao y bộ mô tả tệp 1. Trình mô tả trùng lặp thực sự không hoạt động như một bản sao, nhưng giống như một bí danh của bản sao cũ. Nhân bản 1 cho phép nhiều luồng được chuyển hướng đến 1 mà không ghi đè lên nhau.

Ví dụ: (không &)

$ ls existing-file non-existent-file > tmp 2> tmp 
$ cat tmp 
existing-file 
nt-file: No such file or directory 

Lưu ý rằng 1 ghi đè lên những gì 2 viết.Nhưng không phải khi chúng ta sử dụng &:

$ ls existing-file non-existent-file > tmp 2>&1 
$ cat tmp 
ls: non-existent-file: No such file or directory 
existing-file 

Một bộ mô tả tập tin là một tay cầm vào một tập tin (hoặc nguồn lực đầu vào/đầu ra khác, chẳng hạn như một ống hoặc mạng socket). Khi 12 được chuyển hướng riêng đến tmp (như trong ví dụ đầu tiên), chúng di chuyển con trỏ tệp tmp độc lập. Đó là lý do tại sao các bộ mô tả tập tin ghi đè lên nhau.

Theo Linux man page:

[file descriptor Duplicate] tham khảo với cùng mô tả tập tin mở và do đó file chia sẻ bù đắp và tình trạng tập tin cờ; ví dụ, nếu bù đắp tập tin được sửa đổi bằng cách sử dụng lseek (2) trên một trong các bộ mô tả, chênh lệch cũng được thay đổi cho phần còn lại.

Lưu ý rằng mặc dù & hành vi như một bí danh, 2>&1 phương tiện chuyển hướng 2 vào dòng đó 1 trong hiện trỏ đến. Khi 1 được chuyển hướng đến một mục khác, 2 trỏ đến cùng một tệp mà nó đã độc lập với 1.

Quan sát: [? Trong vỏ, những gì hiện "2> & 1" có nghĩa là]

$ ls existing-file non-existent-file > tmp 2>&1 > tmp1 
$ cat tmp1 
existing-file 
$ cat tmp 
ls: non-existent-file: No such file or directory 
Các vấn đề liên quan