stdin, stderr, chuyển hướng và nhật ký


7

Có sự khác biệt giữa hai dòng?

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1
/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

biết rằng tôi muốn đặt các thiết bị xuất chuẩn và lỗi thực thi của tập lệnh vào tệp nhật ký. Nếu không có sự khác biệt, nếu tôi muốn đăng nhập bản ghi thì sao?


3
Nó sẽ không thể rất dễ dàng chỉ cần cố gắng cho dù kết quả là giống nhau không? Và nhanh hơn nhiều so với hỏi ở đây? Các câu hỏi thậm chí không cho thấy một chút nỗ lực nghiên cứu ít được chào đón ở đây.
Hauke ​​Laging

1
@HaukeLaging: Đây vẫn là một câu hỏi hữu ích.
Brian

@staticx Vậy là sao?
Hauke ​​Laging

@Hauke: vì vậy không có gì sai với nó
Brian

1
@staticx Khi bạn bỏ qua điều hiển nhiên, tôi chỉ cho bạn đánh giá chính thức: unix.stackexchange.com/help/how-to-ask Và nó chắc chắn không có nghĩa là "Nghiên cứu hoặc theo chủ đề"
Hauke ​​Laging

Câu trả lời:


14

Có một sự khác biệt.

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1

Điều này sẽ gửi cả STDOUT và STDERR tới /home/user/stdout_and_error.log.

/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

Điều này sẽ gửi STDOUT tới /home/user/stdout_and_error.logvà STDERR tới những gì trước đây là STDOUT.

 

Khi bạn thực hiện chuyển hướng vỏ, phía bên trái của chuyển hướng sẽ đi đến nơi phía bên phải của chuyển hướng hiện đang đi. Có nghĩa là 2>&1, nó sẽ gửi STDERR (2) đến bất cứ nơi nào STDOUT (1) hiện đang đi.
Nhưng nếu sau đó bạn chuyển hướng STDOUT ở một nơi khác, STDERR sẽ không đi cùng với nó. Nó tiếp tục đi bất cứ nơi nào STDOUT trước đây đã đi. Đây là lý do tại sao trong ví dụ đầu tiên của bạn, cả STDOUT và STDERR sẽ đi đến cùng một nơi, nhưng trong lần thứ hai họ sẽ không.


5

Trên dòng lệnh đầu tiên, shell sẽ thấy >> tệp đầu tiên và nối thiết bị xuất chuẩn vào tệp. 2> & 1 tiếp theo sẽ gửi fd2 (stderr) đến cùng địa điểm fd1 đang diễn ra - đó là vào tệp. Và đó là những gì bạn muốn.

Trên dòng lệnh thứ hai, shell nhìn thấy 2> & 1 trước. Điều đó có nghĩa là "làm cho lỗi tiêu chuẩn (mô tả tệp 2) đi đến cùng một nơi với đầu ra tiêu chuẩn (fd1) đang diễn ra." Không có hiệu lực vì cả fd2 và fd1 đều đã đến terminal. Sau đó >> tệp nối thêm fd1 (stdout) vào tệp. Nhưng fd2 (stderr) vẫn đang đi đến thiết bị đầu cuối.


3

>> Áp dụng thiết bị xuất chuẩn (luồng số 1) vào một tệp.

2>&1 Kết hợp thiết bị xuất chuẩn (luồng số 2) với thiết bị xuất chuẩn (luồng số 1) (Thêm thiết bị xuất chuẩn vào thiết bị xuất chuẩn)

> Viết stdout (luồng số 1) vào một tệp, ghi đè tệp.

1>Viết stdout (luồng số 1) vào một tệp, ghi đè tệp. Giống như trên.

2>Viết stderr (luồng số 2) vào một tệp, ghi đè tệp.

+++

Ví dụ đầu tiên của bạn sẽ nối thiết bị xuất chuẩn vào một tệp, sau đó thêm thiết bị xuất chuẩn vào thiết bị xuất chuẩn.

Ví dụ thứ hai của bạn sẽ thêm thiết bị xuất chuẩn vào thiết bị xuất chuẩn, sau đó nối thiết bị xuất chuẩn kết hợp (có bao gồm thiết bị xuất chuẩn) vào một tệp.


3
Không, ví dụ thứ hai không gửi stderrtệp đến, stderrđã đi đến file descrpitor 1.
cuonglm
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.