Câu trả lời:
Nếu bạn là lập trình viên C, bạn có thể nghĩ &1là "địa chỉ của 1", vì vậy hãy 2>&1đọc "mô tả tệp chuyển hướng # 2 đến cùng một vị trí với # 1".
"Hai đến một" ("thành" >) có ý nghĩa logic với tôi hơn "Hai và một", đó là điều tôi thường có thể nhầm lẫn với nó. Nếu bạn coi "và một" là một danh từ riêng (một địa điểm), thì nó cũng có ý nghĩa ngữ pháp trong ngữ cảnh, khó thực hiện hơn với "Hai và một" - bạn phải xem xét "với một" một danh từ, và nó vẫn không có ý nghĩa ngữ cảnh.
Không phải là ghi nhớ, nhưng tôi đọc nó như sau:
0là stdin.
1là xuất sắc.
2là thiết bị lỗi thời.
>là thành.
<Ra khỏi.
&là mô tả tập tin (trong một số shell).
2>&1
2 > & 1
stderr into file descriptor 1
redirect stderr into stdout
Nó có thể thay đổi nếu bạn gặp rắc rối với bất kỳ mô tả tệp nào trước khi chuyển hướng ...
2>somefile 1>&2
2 > somefile 1 > &2
stderr into somefile and stdout into file descriptor 2
redirect stderr into somefile and stdout into somefile.
Khi bạn viết 2>&1, bạn đang nói "lỗi tiêu chuẩn chuyển sang đầu ra tiêu chuẩn".
Hãy phá vỡ nó.
Trước tiên, bạn muốn ghi nhớ rằng lỗi tiêu chuẩn là 2và đầu ra tiêu chuẩn là 1.
Vì vậy, bạn đã có 2một cái gì đó 1.
"đi đến" được viết >.
Vì vậy, bạn đã có 2>một cái gì đó 1.
2>filenamecó nghĩa là gửi lỗi tiêu chuẩn đến filename. Nhưng bạn không muốn gửi nó đến một tập tin gọi là 1. Bạn muốn một cái gì đó khác: số lượng tệp đã được mở. Đó là những gì &dành cho.
Vì vậy 2>&1.
Bạn cũng có thể nghĩ về nó giống như bạn đang thực hiện một bài tập, trong đó cái >giống như một số bằng và &giống như một $, so sánh:
f=$1
2>&1
Để hiểu một dòng lệnh có nhiều chuyển hướng, điều quan trọng cần biết là các chuyển hướng được thực hiện từ trái sang phải. Xem thứ tự chuyển hướng để biết thêm chi tiết về điều đó.
Nếu bạn hiểu rằng FD2 là STDERR, bạn có thể nghĩ, "Ồ, và bắt STDERR ở bất cứ nơi nào tôi gửi STDOUT (FD1)".
Đồng nghiệp của tôi và tôi thường nói "hai lớn hơn một", bởi vì hầu hết chúng ta không luôn luôn nhớ rằng stderrlà mô tả tập tin 2và stdoutlà 1(đặc biệt là những người mới đến unix / linux), do đó việc nhớ mật khẩu khác về chuyển hướng stderrkhông thực sự làm việc . Vấn đề duy nhất là, bạn vẫn phải nhớ ampersand đi đâu!