it-swarm-vi.tech

Trong Shell, "2> & 1" nghĩa là gì?

Trong Unix Shell, nếu tôi muốn kết hợp stderrstdout vào luồng stdout để thao tác thêm, tôi có thể nối 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 gặp khó khăn trong việc ghi nhớ điều này và tôi liên tục phải tìm kiếm nó, và điều đó chủ yếu là do tôi không hiểu đầy đủ 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 từng nhân vật theo ý nghĩa của 2>&1 không?

2006
Tristan Havelick

Bộ mô tả tệp 1 là đầu ra tiêu chuẩn (stdout).
[.___.] Bộ mô tả tệp 2 là lỗi tiêu 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): ban đầu, 2>1 có thể trông giống như một cách tốt để chuyển hướng stderr sang stdout. Tuy nhiên, nó thực sự sẽ được hiểu là "chuyển hướng stderr đến một tệp có tên 1". & chỉ ra rằng phần tiếp theo là phần mô tả tệp chứ không phải tên tệp. Vì vậy, cấu trúc trở thành: 2>&1.

2226
Ayman Hourieh
echo test > afile.txt

chuyển hướng thiết bị xuất chuẩn thành afile.txt. Điều này 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 một luồng đến một mô tả tệp khác - 0 là stdin, 1 là stdout và 2 là stderr.

Bạn có thể chuyển hướng thiết bị xuất chuẩn sang thiết bị xuất chuẩn 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), nối thêm &1 chuyển hướng stderr vào thiết bị xuất chuẩn.

556
dbr

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

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

1 - Ghi đè hoặc nối thêm?

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

  • > có nghĩa là gửi đến dưới dạng toàn bộ tệp hoàn thành , ghi đè mục tiêu nếu tồn tại (xem tính năng bash noclobber tại # 3 sau).
  • >> có nghĩa là gửi ngoài sẽ nối thêm vào mục tiêu nếu tồn tại.

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

2 - Dòng lệnh Shell 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

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

Vì vậy, 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 đưa STDERR vào bảng điều khiển và dường như đó không phải là hành vi được mong đợi ... Nhưng ...

Nếu bạn muốn thực hiện một số lọc bài đăng về một đầu ra, thì đầu ra 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ư trong đoạn trước, nơi tôi đã viết dường như không phải là hành vi dự kiến ​​ (vì vậy, đây thậm chí có thể là một hành vi dự kiến) .

Chà, có một mẹo nhỏ về chuyển hướng, vì thực hiện các 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: &9 mô tả sẽ xảy ra tự phát vì ) 9>&2.

Phụ lục: nota! Với phiên bản mới của bash (>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 điều này những thứ

$ 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 định dạng đầu ra xếp 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ùng một cú pháp mới, 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

Trong đó STDOUT đi qua một bộ lọc cụ thể, STDERR sang bộ lọc khác và cuối cùng cả hai đầu ra được hợp nhất đều đi qua bộ lọc lệnh thứ ba.

3 - Tùy chọn Word về noclobber và cú pháp >|

Đó là về ghi đè :

Trong khi set -o noclobber hướng dẫn bash đến không ghi đè lên 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

Các tập tin đượ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

Vượt 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

Bỏ cài đặt tùy chọn này và/hoặc tìm hiểu 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 - Thủ thuậ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 tôi thấy rằng một cú pháp đúng có thể là:

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

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

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

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

Nota: if 2>&1 tồn tại, 1>&2 cũng là một cú pháp đúng:

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

4b- Bây giờ, tôi sẽ cho phép 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 thêm thông tin

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

man -Len -Pless\ +/^REDIRECTION bash

trong một bash bàn điều khiển ;-)

294
F. Hauri

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

Chuyển hướng cả đầu ra tiêu chuẩn và lỗi tiêu chuẩn sang một tệp

$ lệnh &> tập tin

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 sang tệp. Đây là lối tắt của Bash để nhanh chóng chuyển hướng 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 đều trỏ đến file. Vì vậy, bất cứ điều gì được viết cho thiết bị xuất chuẩn và thiết bị xuất chuẩn sẽ đượ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 lần lượt:

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

Đây là một cách phổ biến hơn nhiều để chuyển hướng cả hai luồng vào một tệp. Thiết bị xuất chuẩn đầu tiên được chuyển hướng đến tệp, và sau đó thiết bị xuất chuẩn được sao chép giống như thiết bị xuất chuẩn. Vì vậy, cả hai luồng cuối cùng đều trỏ đến file.

Khi Bash thấy một số chuyển hướng, nó xử lý chúng từ trái sang phải. Chúng ta hãy đi 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 như thế này:

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 đến tập tin:

Enter image description here

Bash tiếp theo thấy chuyển hướng thứ hai 2> & 1. Chúng tôi chưa từng thấy sự chuyển hướng này trước đây. Cái này sao chép bộ mô tả tệp 2 thành bản sao của bộ mô tả tệp 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 tin.

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 các vấn đề trong Bash! Lệnh này chỉ chuyển hướng đầu ra tiêu chuẩn vào tệp. Stderr vẫn sẽ in ra thiết bị đầu cuối. Để hiểu tại sao điều đó xảy ra, chúng ta hãy thực hiện lại các bước. Vì vậy, trước khi chạy lệnh, bảng mô tả tệp trông như thế này:

Enter image description here

Bây giờ Bash xử lý các chuyển hướng từ trái sang phải. Đầu tiên nó nhìn thấy 2> & 1 vì vậy nó sao chép stderr thành 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, >file và nó chuyển hướng thiết bị xuất chuẩn thành tệp:

Enter image description here

Bạn có thấy những gì xảy ra ở đây? Stdout bây giờ trỏ đến tập tin, nhưng stderr vẫn trỏ đến thiết bị đầu cuối! Tất cả mọi thứ được ghi vào 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

$ lệnh &> tập tin

hoàn toàn giống như:

$ lệnh> & tập tin

82
Deen John

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

  • Số không là stdin
  • Một là stdout
  • Hai là stderr

2>&1 chuyển hướng fd 2 thành 1.

Điều này hoạt động 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 không chuẩn để ghi nhật ký tùy chỉnh để bạn không nhìn thấy nó trừ khi bạn chuyển hướng nó đến một tệp hoặc một cái gì đó.

77
Colin Burnett

Cấu trúc đó gửi luồng lỗi tiêu chuẩn (stderr) đến hiện tại vị trí của đầ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 sang phương thức khác bằng cách sử dụng phương pháp này nhưng nó thường được sử dụng để phân luồng stdoutstderr thành một luồng duy nhất để 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 cái cuối cùng sẽ không direct stderr thành outfile2 - nó chuyển hướng nó thành stdout khi gặp phải đối số (outfile1) và sau đó chuyển hướng stdout thành outfile2.

Điều này cho phép một số mánh khóe khá tinh vi.

54
paxdiablo

2>&1 là cấu trúc POSIX Shell. Đây là một sự cố, mã thông báo bằng mã thông báo:


2: " Lỗi tiêu chuẩn " mô tả tệp đầu ra.

>&: Sao chép toán tử mô tả tệp đầu ra toán tử (một biến thể của Chuyển hướng đầu ra toán tử >). Cho [x]>&[y], bộ mô tả tệp được ký hiệu là x được tạo thành một bản sao của bộ mô tả tệp đầu ra y.

1 " Mô tả tệp đầu ra tiêu chuẩn ".

Biểu thức 2>&1 sao chép mô tả tệp 1 vào vị trí 2, do đó, 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 sẽ được chuyển đế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:

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

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

Các tệp đang mở được biểu thị bằng số thập phân bắt đầu bằng 0. Giá trị lớn nhất có thể được xác định theo thực hiện; tuy nhiên, tất cả các triển khai sẽ hỗ trợ ít nhấ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à cách 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 tiêu 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à viết đầ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 tiêu chuẩn. Các toán tử chuyển hướng có thể được bắt đầu bằng một hoặc nhiều chữ số (không cho phép các ký tự can thiệp) để chỉ định số mô tả tệp.

17
wjordan

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

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

Đây là Unix tiêu 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, do đó 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 ra out.log và lỗi tiêu chuẩn thành err.log.

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

17
Marcus Thornton

Để 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 đến stderr) và ghi nó vào đầu ra tiêu chuẩn (stdout).

Điều này hữu ích với, ví dụ 'thêm' 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 (lỗi in chương trình)

"2> & 1" chỉ đơn giản là chỉ mọi thứ được gửi tới thiết bị xuất chuẩn, thay vào đó là thiết bị xuất chuẩn.

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

16
Andrioid

Từ quan điểm của một lập trình viên, nó có nghĩa chính xác như sau:

dup2(1, 2);

Xem trang nam .

Hiểu rằng 2>&1 là một bản sao cũng giải thích tại sao ...

command >file 2>&1

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

command 2>&1 >file

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

11
ams

Với điều kiện /foo không tồn tại trên hệ thống của bạn và /tmp không có

$ ls -l /tmp /foo

sẽ in nội dung của /tmp và in thông báo lỗi cho /foo

$ ls -l /tmp /foo > /dev/null

sẽ gửi nội dung của /tmp đến /dev/null và in thông báo lỗi cho /foo

$ ls -l /tmp /foo 1> /dev/null

sẽ làm chính xác như vậy (lưu ý 1)

$ ls -l /tmp /foo 2> /dev/null

sẽ in nội dung của /tmp và gửi thông báo lỗi tới /dev/null

$ ls -l /tmp /foo 1> /dev/null 2> /dev/null

sẽ gửi cả danh sách cũng như thông báo lỗi tới /dev/null

$ ls -l /tmp /foo > /dev/null 2> &1

là tốc ký

6
Matijs

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

Bản ghi nhớ cá nhân của tôi cho toán tử 2>&1 là đây:

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

Cũng hoạt động ghi nhớ tương tự cho chuyển hướng thường được sử dụng khác, 1>&2:

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

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

6
Kurt Pfeifle

Điều này giống như chuyển lỗi đến thiết bị xuất chuẩn hoặc thiết bị đầu cuối.

Đó là, cmd không phải là một lệnh:

$cmd 2>filename
cat filename

command not found

Lỗi được gửi đến tập tin như thế này:

2>&1

Lỗi tiêu chuẩn được gửi đến thiết bị đầu cuối.

5
Kalanidhi

Chuyển hướng đầu vào

Chuyển hướng đầu vào làm cho tệp có kết quả tên từ việc mở rộng Word được mở để đọc trên mô tả tệp n hoặc đầu vào tiêu chuẩn (mô tả tệp 0) nếu n không được chỉ định.

Định dạng chung để chuyển hướng đầu vào là:

[n]<Word

Chuyển hướng đầu ra

Chuyển hướng đầu ra làm cho tệp có kết quả tên từ việc mở rộng Word được mở để ghi trên mô tả tệp n hoặc đầu ra tiêu chuẩn (mô tả tệp 1) nếu n không được chỉ định. Nếu tập tin không tồn tại, nó được tạo ra; nếu nó tồn tại, nó bị cắt cụt về kích thước không.

Định dạng chung để chuyển hướng đầu ra là:

[n]>Word

Di chuyển mô tả tập tin

Toán tử chuyển hướng,

[n]<&digit-

di chuyển chữ số mô tả tệp sang mô tả tệp n hoặc đầu vào tiêu chuẩn (mô tả tệp 0) nếu n không được chỉ định. chữ số được đóng lại sau khi được nhân đôi thành n.

Tương tự, toán tử chuyển hướng

[n]>&digit-

di chuyển chữ số mô tả tệp sang mô tả tệp n hoặc đầu ra tiêu chuẩn (mô tả tệp 1) nếu n không được chỉ định.

Tham chiếu:

man bash

Nhập /^REDIRECT để tìm đến phần redirection và tìm hiểu thêm ...

Một phiên bản trực tuyến có tại đây: .6 Chuyển hướng

Tái bút

Rất nhiều thời gian, man là công cụ mạnh mẽ để học Linux.

4
yurenchen

0 cho đầu vào, 1 cho thiết bị xuất chuẩn và 2 cho thiết bị xuất chuẩn.

Một mẹo: somecmd >1.txt 2>&1 là chính xác, trong khi somecmd 2>&1 >1.txt hoàn toàn sai không có hiệu lực!

1
fzyzcjy