Thứ tự chuyển hướng


29

Tôi không hiểu làm thế nào máy tính đọc lệnh này.

cat file1 file2 1> file.txt 2>&1

Nếu tôi hiểu, 2>&1chỉ cần chuyển hướng Lỗi tiêu chuẩn sang Đầu ra tiêu chuẩn.

Theo logic đó, lệnh đọc cho tôi như sau:

  1. tập tin nối file1file2.

  2. gửi stdouttừ hoạt động này đến file.txt.

  3. gửi stderrđến stdout.

  4. kết thúc?

Tôi không chắc máy tính đang làm gì. Theo logic của tôi, lệnh nên là

cat file1 file2 2>&1 > file.txt

nhưng điều này không đúng

Câu trả lời:


46

Tôi thấy dễ dàng hơn khi nghĩ đến việc sử dụng các bài tập.

  • > giống như =
  • & giống như $

Bạn bắt đầu với

1 = /dev/tty
2 = /dev/tty

sau đó là ví dụ đầu tiên của bạn 1> file.txt 2>&1,

1 = file.txt
2 = $1           # and currently $1 = file.txt

để lại cho bạn với

1 = file.txt
2 = file.txt

Nếu bạn đã làm theo cách khác, một lần nữa bạn bắt đầu với

1 = /dev/tty
2 = /dev/tty

sau đó 2>&1 > file.txtthực hiện

2 = $1           # and currently $1 = /dev/tty
1 = file.txt

vì vậy kết quả cuối cùng là

1 = file.txt
2 = /dev/tty

và bạn chỉ chuyển hướng stdout, không stderr.


Tôi sắp xếp tương tự, nhưng thật khó hiểu - ý nghĩa của nó là gì $?
Eliran Malka

Trong một nhiệm vụ như thế var=$othervar, $giới thiệu tên biến ở phía bên tay phải. Trong một chuyển hướng như 2>&1, &giới thiệu số mô tả tập tin ở phía bên tay phải. Tôi đang nói rằng bạn có thể nghĩ về nó như "tập tin 2 bằng tập tin 1". (Nhưng có hai loại bằng: <có nghĩa là "để đọc" và >có nghĩa là "để viết".)
Mikel

12

Thứ tự chuyển hướng là quan trọng, và chúng nên được đọc từ trái sang phải .

Ví dụ: command 2>&1 >somefilecó nghĩa là:

  1. Chuyển hướng stderr(cụ thể 2) đến đích hiện tại của stdout(tại thời điểm này, thiết bị đầu cuối).
  2. Sau đó đổi stdoutsang đi somefile.

Vì vậy, trong trường hợp này, stderrđi đến thiết bị đầu cuối và stdoutđi đến một tệp, đó không phải là những gì bạn có thể muốn.

Mặt khác, command >somefile 2>&1có nghĩa là:

  1. Chuyển hướng stdoutđếnsomefile
  2. Sau đó chuyển hướng stderrđến cùng đích với stdout( somefile).

Trong trường hợp cuối cùng này cả hai stderrstdoutđi đến somefile, đó có lẽ là những gì bạn muốn.


4
cat file1 file2 1> file.txt 2>&1

>& Trên thực tế có nghĩa là trùng lặp, nó sử dụng lệnh gọi hệ thống kép để ánh xạ một bộ mô tả tệp mới vào một tệp đã được mở.

Vì vậy, trước tiên, bạn (bash thực sự) phải mở thiết bị xuất chuẩn mới trước đó, nói rằng "và chuyển hướng thiết bị xuất chuẩn đến bất kỳ thiết bị xuất chuẩn nào hiện đang được đặt."


điều này thật tuyệt! tôi đã tự hỏi về điều đó &. bạn có thể gửi kèm một số tài liệu tham khảo cho cú pháp đó, hoặc - tốt hơn nữa - một số tài nguyên tốt trên hệ thống song công nói trên?
Eliran Malka

1
'man dup' tài liệu cuộc gọi hệ thống.
X Tian

có ý nghĩa :) thanx
Eliran Malka
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.