Câu hỏi Trong trình bao, “2> & 1” có nghĩa là gì?


Trong Unix shell, nếu tôi muốn kết hợp stderr và stdout vào stdout để xử lý thêm, tôi có thể thêm phần sau vào cuối lệnh của mình:

2>&1

Vì vậy, nếu tôi muốn sử dụng head trên đầu ra từ g++, Tôi có thể làm một cái gì đó như thế này:

g++ lots_of_errors 2>&1 | head

vì vậy tôi chỉ có thể thấy một vài lỗi đầu tiên.

Tôi luôn luôn gặp khó khăn khi nhớ điều này, và tôi liên tục phải tìm kiếm nó, và nó chủ yếu là bởi vì tôi không hoàn toàn hiểu cú pháp của thủ thuật đặc biệt này.

Ai đó có thể phá vỡ điều này và giải thích nhân vật theo nhân vật 2>&1  có nghĩa?


1738
2018-05-03 22:57


gốc


@ Tôi không nghĩ rằng nó chỉ là bash - Tôi tin rằng đó là một điều bourne shell; do đó sh, bash, ksh, tro, dấu gạch ngang, v.v. - guns
Đây là một phần của đoạn chuyển hướng mô tả các vỏ tuân thủ POSIX hoặc trình bao POSIX. ksh là một shell POSIX chẳng hạn. Xem:pubs.opengroup.org/onlinepubs/009695399/utilities/… - jim mcnamara
Cấu trúc này cũng hoạt động trên Windows. - Vadzim
Nó thường làm tốt hơn 2>&1 hơn 2> / dev / null ;-) - F. Hauri
Tôi nghĩ tôi sẽ đề cập đến |&  là viết tắt của 2>&1 | nếu bạn đang sử dụng zsh. Tôi không thể nói được liệu điều đó có áp dụng cho các vỏ đạn giống như bourne hay không hay chỉ là một tính năng duy nhất của zsh. - chrixian


Các câu trả lời:


Bộ mô tả tập tin 1 là đầu ra tiêu chuẩn (stdout).
Bộ mô tả tập tin 2 là lỗi chuẩn (stderr).

Đây là một cách để nhớ cấu trúc này (mặc dù nó không hoàn toàn chính xác): lúc đầu, 2>1 có thể trông giống như một cách tốt để chuyển hướng stderr đến stdout. Tuy nhiên, nó thực sự sẽ được hiểu là "chuyển hướng stderr vào một tệp có tên 1". & chỉ ra rằng những gì sau là một bộ mô tả tập tin và không phải là một tên tập tin. Vì vậy, cấu trúc trở thành: 2>&1.


1943
2018-05-03 23:04



nhưng không nên thay vì &2>&1? - dokaspar
@Dominik: Không, & chỉ được hiểu là "bộ mô tả tệp" trong ngữ cảnh chuyển hướng. Viết command &2>& được phân tích cú pháp là command & và 2>&1, tức là "chạy command trong nền, sau đó chạy lệnh 2 và chuyển hướng stdout của nó vào stdout của nó ". - Adam Rosenfield
Thông tin thú vị ở đây: mywiki.wooledge.org/BashFAQ/055 - Halil Özgür
Nhưng làm thế nào bạn sẽ chuyển hướng stderr đến một tập tin có tên '& 1'? - Martín Fixman
@Martin: 2>'&1' - rogual


echo test > afile.txt

chuyển hướng stdout sang afile.txt. Điều này cũng giống như làm

echo test 1> afile.txt

Để chuyển hướng stderr, bạn làm:

echo test 2> afile.txt

>& là cú pháp để chuyển hướng luồng tới một bộ mô tả tệp khác - 0 là stdin, 1 là stdout và 2 là stderr.

Bạn có thể chuyển hướng stdout tới stderr bằng cách thực hiện:

echo test 1>&2 # or echo test >&2

Hoặc ngược lại:

echo test 2>&1

Vì vậy, trong ngắn hạn ... 2> chuyển hướng stderr sang tệp (không xác định), phụ thêm &1 chuyển hướng stderr thành stdout.


481
2018-05-03 22:59



Chuyện này có ý nghĩa gì với bạn không, java ... 2&1 >> data.log, Tôi thấy một trong những đồng nghiệp của tôi đã làm điều này? - Thang Pham
@ Harry trông giống như một trình bao không bị bash, hoặc lỗi đánh máy .. cmd 2>&1 >> somefile.log sẽ thêm stdout / stderr vào một tệp - về cơ bản giống như trên, với >> file để nối thêm - dbr
@dbr cmd 2>&1 >>file không chuyển hướng stderr vào tệp, nhưng cmd >> file 2>&1 làm. Đặt hàng các vấn đề. Trong trường hợp đầu tiên, stderr được chuyển hướng đến stdout của shell (có thể là tty nếu lệnh được nhập tương tác), và sau đó stdout được chuyển hướng đến tệp. Trong trường hợp thứ hai, stdout được chuyển đến tệp và sau đó stderr được chuyển đến cùng một vị trí. - William Pursell
Tôi thích câu trả lời ở trên, nhưng nó có thể là một cảm ứng rõ ràng hơn. "2> & 1" chuyển hướng stderr đến đích của stdout. Vì vậy, nếu bạn có một cái gì đó như "ls -l >> directoryContents 2> & 1" Kết quả sẽ là một tập tin có tên directoryContents sẽ có nội dung của thư mục làm việc nối thêm vào nó. Nếu có bất kỳ lỗi nào trong thực thi: các thông báo lỗi cũng sẽ được nối vào tệp directoryContents, khi chúng xảy ra. - Max West
Là 0(or 1,2)>&0(or 1,2) như một tùy chọn để kiểm soát đầu ra? Là echo test >test.log 2>&1 giống như echo test 2>&1 >test.log? - Simin Jie


Một số thủ thuật về chuyển hướng

Một số đặc điểm cú pháp về điều này có thể có những hành vi quan trọng. Có một số mẫu nhỏ về chuyển hướng, STDERR, STDOUTvà đối số sắp đặt.

1 - Ghi đè hoặc bổ sung?

Ký hiệu > nghĩa là sự chuyển hướng.

  • > nghĩa là gửi đến như một tập tin hoàn chỉnh, ghi đè mục tiêu nếu tồn tại (xem noclobber tính năng bash tại # 3 một lát sau).
  • >> nghĩa là gửi thêm vào sẽ thêm vào mục tiêu nếu tồn tại.

Trong mọi trường hợp, tệp sẽ được tạo nếu chúng không tồn tại.

2 - The dòng lệnh shell là phụ thuộc vào thứ tự !!

Để kiểm tra điều này, chúng ta cần một lệnh đơn giản sẽ gửi một cái gì đó trên cả hai đầu ra:

$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

(Mong bạn không có thư mục có tên /tnt, tất nhiên ;). Vâng, chúng tôi có nó !!

Vì vậy, chúng ta hãy xem:

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1

$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory

Dòng lệnh cuối cùng đổ STDERR với giao diện điều khiển và dường như không phải là hành vi mong đợi ... Nhưng ...

Nếu bạn muốn làm cho một số bài lọc khoảng một đầu ra, cái kia hoặc cả hai:

$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'

$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->

Lưu ý rằng dòng lệnh cuối cùng trong đoạn này giống hệt như đoạn trước, nơi tôi đã viết dường như không phải là hành vi mong đợi (vì vậy, điều này thậm chí có thể là một hành vi mong đợi).

Vâng, có một mẹo nhỏ về chuyển hướng, cho thực hiện thao tác khác nhau trên cả hai đầu ra:

$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2  2>&1  | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan  7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory

Nota: &9bộ mô tả sẽ xảy ra một cách tự phát vì ) 9>&2.

Phụ lục: nota! Với phiên bản mới của  (>4.0) có một tính năng mới và cú pháp gợi cảm hơn để thực hiện những việc như sau:

$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory

Và cuối cùng cho một định dạng đầu ra tầng như vậy:

$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
     1  O: drwxrwxrwt 118 root root 196608 Jan  7 12:29 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

Phụ lục: nota! Cú pháp mới giống nhau, theo cả hai cách:

$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
     1  O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

Ở đâu STDOUT đi qua một bộ lọc cụ thể, STDERR khác và cuối cùng cả hai kết quả đầu ra sáp nhập đi qua một bộ lọc lệnh thứ ba.

3 - Một từ về noclobber tùy chọn và >| cú pháp

Đó là về ghi đè:

Trong khi set -o noclobber hướng dẫn bash không phải ghi đè bất kỳ tệp hiện có nào, >| cú pháp cho phép bạn vượt qua giới hạn này:

$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:15 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:19 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:21 CET 2013

Tệp này được ghi đè mỗi lần, ngay bây giờ:

$ set -o noclobber

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

Đi qua với >|:

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:18:58 CET 2013

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:19:01 CET 2013

Hủy đặt tùy chọn này và / hoặc hỏi nếu đã được đặt.

$ set -o | grep noclobber
noclobber           on

$ set +o noclobber

$ set -o | grep noclobber
noclobber           off

$ date > $testfile ; cat $testfile
Mon Jan  7 13:24:27 CET 2013

$ rm $testfile

4 - Bí quyết cuối cùng và hơn thế nữa ...

Để chuyển hướng cả hai đầu ra từ một lệnh đã cho, chúng ta thấy rằng một cú pháp đúng có thể là:

$ ls -ld /tmp /tnt >/dev/null 2>&1

cho cái này đặc biệt trường hợp, có một cú pháp phím tắt: &> ... hoặc là >&

$ ls -ld /tmp /tnt &>/dev/null

$ ls -ld /tmp /tnt >&/dev/null

Nota: if 2>&1 hiện hữu, 1>&2 cũng là một cú pháp chính xác:

$ ls -ld /tmp /tnt 2>/dev/null 1>&2

4b- Bây giờ, tôi sẽ cho bạn suy nghĩ về:

$ ls -ld /tmp /tnt 2>&1 1>&2  | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

$ ls -ld /tmp /tnt 1>&2 2>&1  | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

4c- Nếu bạn quan tâm đến hơn thông tin

Bạn có thể đọc hướng dẫn sử dụng tốt bằng cách nhấn:

man -Len -Pless\ +/^REDIRECTION bash

trong một  console ;-)


257
2018-04-29 16:33



Đọc thêm: Nếu bạn thích điều này, bạn có thể apreciate: Cách lạm dụng chuyển hướng có thể mang lại những hành vi lạ - F. Hauri
Đọc thêm ||: A chức năng để lưu trữ cả hai đầu ra thành các biến riêng biệt - F. Hauri


Các số tham chiếu đến các bộ mô tả tập tin (fd).

  • Zero là stdin 
  • Một là stdout 
  • Hai là stderr

2>&1 chuyển hướng fd 2 sang 1.

Điều này làm việc cho bất kỳ số lượng mô tả tập tin nếu chương trình sử dụng chúng.

Bạn có thể xem /usr/include/unistd.h nếu bạn quên chúng:

/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */

Điều đó nói rằng tôi đã viết các công cụ C sử dụng các mô tả tập tin không chuẩn cho việc ghi nhật ký tùy chỉnh, do đó bạn không thấy nó trừ khi bạn chuyển hướng nó đến một tệp hoặc một cái gì đó.


67
2018-05-03 22:58





Cấu trúc đó gửi luồng lỗi chuẩn (stderr) đến hiện hành vị trí đầu ra tiêu chuẩn (stdout) - vấn đề tiền tệ này dường như đã bị bỏ qua bởi các câu trả lời khác.

Bạn có thể chuyển hướng bất kỳ xử lý đầu ra nào khác bằng cách sử dụng phương thức này nhưng nó thường được sử dụng nhất cho kênh stdout và stderr luồng vào một luồng đơn để xử lý.

Một số ví dụ:

# Look for ERROR string in both stdout and stderr.
foo 2>&1 | grep ERROR

# Run the less pager without stderr screwing up the output.
foo 2>&1 | less

# Send stdout/err to file (with append) and terminal.
foo 2>&1 |tee /dev/tty >>outfile

# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2

Lưu ý rằng người cuối cùng sẽ không phải thẳng thắn stderr đến outfile2 - nó chuyển hướng nó đến những gì stdout là khi đối số gặp phải (outfile1) và sau đó chuyển hướng stdout đến outfile2.

Điều này cho phép một số thủ thuật khá phức tạp.


49
2018-05-03 23:54



Mặc dù ví dụ cuối cùng sẽ rõ ràng hơn nhiều như: foo> outfile2 2> outfile1 - Michael Cramer
Rõ ràng hơn, vâng, nhưng điều đó sẽ không thể hiện bản chất chuyển hướng "vị trí". Ví dụ này được giả tạo vì thường không có ích khi thực hiện điều này trong một dòng - phương pháp này trở nên thực sự hữu ích khi các bên khác nhau chịu trách nhiệm về các phần khác nhau của chuyển hướng. Ví dụ: khi một tập lệnh thực hiện một chút chuyển hướng và bạn chạy nó bằng một bit khác. - paxdiablo
Tôi chỉ nhận ra rằng ví dụ cuối cùng cũng giải quyết một sự nhầm lẫn lâu dài mà tôi đã có liên quan đến lý do tại sao điều này: some_program 2>&1 > /dev/null không hoạt động như thế này: some_program > /dev/null 2>&1. - snapfractalpop
Nhận xét của bạn về ví dụ cuối cùng là giá trị của các chữ cái trong vàng :-) Tôi không bao giờ nghĩ rằng các đối số chuyển hướng này là vị trí ... Tôi nghĩ rằng điều này là khá quan trọng để biết. - Nils-o-mat


Tôi đã tìm thấy bài đăng tuyệt vời này trên chuyển hướng: Tất cả về chuyển hướng

Chuyển cả đầu ra tiêu chuẩn và lỗi chuẩn sang tệp

$ command &> tệp

Một lớp lót này sử dụng &> toán tử để chuyển hướng cả hai luồng đầu ra - stdout và stderr - từ lệnh này sang tệp khác. Đây là phím tắt của Bash để chuyển hướng nhanh cả hai luồng đến cùng một đích.

Đây là cách bảng mô tả tệp trông giống như sau khi Bash đã chuyển hướng cả hai luồng:

Enter image description here

Như bạn có thể thấy, cả stdout và stderr hiện trỏ đến file. Vì vậy, bất cứ điều gì bằng văn bản cho stdout và stderr được ghi vào file.

Có một số cách để chuyển hướng cả hai luồng đến cùng một đích. Bạn có thể chuyển hướng từng luồng một:

$ command> tệp 2> & 1

Đây là cách phổ biến hơn nhiều để chuyển hướng cả hai luồng tới một tệp. Đầu tiên stdout được chuyển hướng đến tập tin, và sau đó stderr được nhân đôi để được giống như stdout. Vì vậy, cả hai luồng đều chỉ đến file.

Khi Bash thấy một số chuyển hướng, nó xử lý chúng từ trái sang phải. Hãy xem qua các bước và xem điều đó xảy ra như thế nào. Trước khi chạy bất kỳ lệnh nào, bảng mô tả tệp của Bash trông giống như sau:

Enter image description here

Bây giờ Bash xử lý tệp chuyển hướng đầu tiên>. Chúng tôi đã thấy điều này trước đây và nó làm cho điểm xuất sắc thành tệp:

Enter image description here

Tiếp theo Bash thấy chuyển hướng thứ hai 2> & 1. Chúng tôi chưa từng thấy chuyển hướng này trước đây. Điều này một bản sao mô tả tập tin 2 là một bản sao của bộ mô tả tập tin 1 và chúng tôi nhận được:

Enter image description here

Cả hai luồng đã được chuyển hướng đến tệp.

Tuy nhiên hãy cẩn thận ở đây! Viết

lệnh> tệp 2> & 1

không giống như viết:

$ lệnh 2> & 1> tệp

Thứ tự chuyển hướng quan trọng trong Bash! Lệnh này chỉ chuyển hướng đầu ra tiêu chuẩn sang tệp. Stderr sẽ vẫn in tới thiết bị đầu cuối. Để hiểu tại sao điều đó xảy ra, chúng ta hãy đi qua các bước một lần nữa. Vì vậy, trước khi chạy lệnh, bảng mô tả tập tin trông giống như sau:

Enter image description here

Bây giờ Bash xử lý các chuyển hướng từ trái sang phải. Nó lần đầu tiên nhìn thấy 2> & 1 vì vậy nó trùng lặp stderr để stdout. Bảng mô tả tệp trở thành:

Enter image description here

Bây giờ Bash thấy chuyển hướng thứ hai, >filevà nó chuyển hướng stdout thành tệp:

Enter image description here

Bạn có thấy điều gì xảy ra ở đây không? Stdout bây giờ chỉ vào tập tin, nhưng stderr vẫn trỏ đến thiết bị đầu cuối! Tất cả mọi thứ được viết cho stderr vẫn được in ra màn hình! Vì vậy, rất, rất cẩn thận với thứ tự chuyển hướng!

Cũng lưu ý rằng trong Bash, viết

$ command &> tệp

chính xác giống như:

$ command> & tệp


47
2017-10-29 13:04



Hai số cuối cùng khác nhau nếu "lệnh" kết thúc bằng một số, khi đó được lấy làm mô tả tệp tùy chọn cho >& - M.M
lời giải thích tuyệt vời! Cảm ơn bạn - Vicer


2>&1 là một cấu trúc vỏ POSIX. Dưới đây là bảng phân tích, mã thông báo bằng mã thông báo:


2: "Lỗi chuẩn"mô tả tập tin đầu ra.

>&: Nhân bản một bộ mô tả tệp đầu ra toán tử (một biến thể của Chuyển hướng đầu ra nhà điều hành >). Được [x]>&[y], bộ mô tả tệp được biểu thị bằng x được tạo thành bản sao của bộ mô tả tệp đầu ra y.

1 "Đầu ra tiêu chuẩn"mô tả tập tin đầu ra.

Cách diễn đạt 2>&1 -bộ mô tả tập tin bản sao 1 đến vị trí 2, vì vậy bất kỳ đầu ra nào được ghi vào 2 ("lỗi tiêu chuẩn") trong môi trường thực thi đi đến cùng một tệp được mô tả ban đầu bởi 1 ("đầu ra tiêu chuẩn").


Giải thích thêm:

Trình mô tả tệp: "Số nguyên duy nhất cho mỗi quá trình, số nguyên không âm được sử dụng để xác định tệp mở cho mục đích truy cập tệp."

Đầu ra / lỗi chuẩn: Tham khảo ghi chú sau trong Chuyển hướng phần của tài liệu shell:

Các tệp mở được biểu thị bằng số thập phân bắt đầu bằng số không. Giá trị lớn nhất có thể được xác định thực hiện; tuy nhiên, tất cả các triển khai sẽ hỗ trợ ít nhất từ ​​0 đến 9, bao gồm, để ứng dụng sử dụng. Những con số này được gọi là "mô tả tập tin". Các giá trị 0, 1 và 2 có ý nghĩa đặc biệt và sử dụng thông thường và được ngụ ý bởi các hoạt động chuyển hướng nhất định; chúng được gọi là đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và lỗi chuẩn, tương ứng. Các chương trình thường lấy đầu vào của chúng từ đầu vào tiêu chuẩn, và ghi đầu ra trên đầu ra tiêu chuẩn. Thông báo lỗi thường được viết trên lỗi chuẩn. Các toán tử chuyển hướng có thể được đặt trước bởi một hoặc nhiều chữ số (không cho phép ký tự can thiệp) để chỉ định số mô tả tập tin.


13
2017-12-25 06:43





Để trả lời câu hỏi của bạn: Phải mất bất kỳ đầu ra lỗi nào (thường được gửi tới stderr) và ghi nó vào đầu ra tiêu chuẩn (stdout).

Điều này hữu ích với, ví dụ 'nhiều hơn' khi bạn cần phân trang cho tất cả đầu ra. Một số chương trình như in thông tin sử dụng vào stderr.

Để giúp bạn nhớ

  • 1 = đầu ra tiêu chuẩn (nơi các chương trình in đầu ra bình thường)
  • 2 = lỗi tiêu chuẩn (nơi các chương trình in lỗi)

"2> & 1" chỉ đơn giản là trỏ tất cả mọi thứ được gửi đến stderr, để stdout thay thế.

Tôi cũng khuyên bạn nên đọc bài đăng này về chuyển hướng lỗi nơi chủ đề này được đề cập đầy đủ chi tiết.


12
2018-05-03 23:24





2 là lỗi chuẩn giao diện điều khiển.

1 là đầu ra tiêu chuẩn của giao diện điều khiển.

Đây là Unix chuẩn, và Windows cũng tuân theo POSIX.

Ví dụ. khi bạn chạy

perl test.pl 2>&1

lỗi tiêu chuẩn được chuyển hướng đến đầu ra tiêu chuẩn, vì vậy bạn có thể thấy cả hai đầu ra cùng nhau:

perl test.pl > debug.log 2>&1

Sau khi thực hiện, bạn có thể thấy tất cả đầu ra, bao gồm cả lỗi, trong debug.log.

perl test.pl 1>out.log 2>err.log

Sau đó, đầu ra tiêu chuẩn đi đến out.log, và lỗi tiêu chuẩn để err.log.

Tôi đề nghị bạn cố gắng hiểu những điều này.


12
2017-07-19 03:23



Mẫu thứ hai là sai: theo thứ tự ưu tiên STDERR được chuyển hướng đến STDOUT, chỉ mặc định STDOUT sẽ được ghi vào debug.log (không phải STDERR) xem câu trả lời của tôi (đoạn # 2)! Đảm bảo cả hai để được chuyển hướng đến cùng một tệp, bạn phải đảo ngược chỉ thị chuyển hướng: perl test.pl > debug.log 2>&1 - F. Hauri


Từ quan điểm của lập trình viên, điều đó có nghĩa chính xác điều này:

dup2(1, 2);

Xem trang người đàn ông.

Hiểu điều đó 2>&1 là một sao chép cũng giải thích tại sao ...

command >file 2>&1

... không giống như ...

command 2>&1 >file

Người đầu tiên sẽ gửi cả hai luồng tới file, trong khi thứ hai sẽ gửi lỗi đến stdoutvà đầu ra bình thường vào file.


10
2017-12-03 10:20





Mọi người, luôn nhớ paxdiablogợi ý về hiện hành vị trí của mục tiêu chuyển hướng ...  quan trọng.

Sự nhớ lầm cá nhân của tôi cho 2>&1 nhà điều hành là:

  • Hãy nghĩ về & như ý nghĩa 'and' hoặc là 'add' (nhân vật là một ký hiệu- -phải không?)
  • Vì vậy, nó sẽ trở thành: 'chuyển hướng 2 (stderr) đến nơi 1 (stdout) đã có / hiện tại là và thêm vào cả hai luồng '.

Cùng một công việc ghi nhớ cho chuyển hướng thường được sử dụng khác, 1>&2:

  • Hãy nghĩ về & Ý nghĩa and hoặc là add... (bạn có ý tưởng về dấu và, đúng không?)
  • Vì vậy, nó sẽ trở thành: 'chuyển hướng 1 (stdout) đến nơi 2 (stderr) đã có / hiện tại là và thêm vào cả hai luồng '.

Và luôn nhớ: bạn phải đọc chuỗi các chuyển hướng 'từ cuối', từ phải sang trái (không phải từ trái sang phải).


4
2017-07-01 10:47