2010-11-21 2 views
6
exec 3>&1       # Save current "value" of stdout. 
ls -l 2>&1 >&3 3>&- | grep bad 3>&- # Close fd 3 for 'grep' (but not 'ls'). 
#    ^^^^ ^^^^ 
exec 3>&-       # Now close it for the remainder of the script. 

Tôi nhận được dòng thứ 3 nơi fd 3 đang bị đóng.Giúp tôi hiểu chuyển hướng io đơn giản này trong bash từ hướng dẫn ABS

Nghi ngờ: Chuyển hướng dòng 1 fd 3 đến stdout, trên toàn cầu ... phải không?
Câu hỏi: Điều gì đang xảy ra trên dòng thứ 2? Vui lòng cung cấp giải thích chi tiết nếu có thể.

+1

Mặc dù người ta có thể thực hiện các thủ thuật phức tạp với các mô tả bổ sung trong * sh, cho dù điều này nên được thực hiện cho schlub nghèo người phải đọc nó tiếp theo (ví dụ bạn) là ít nhất định. – msw

+0

@msw Tôi đã xem xét hồ sơ của bạn và bạn dường như có kiến ​​thức rất tốt về vỏ Linux/UNIX, vv Tôi tôn trọng bạn vì điều đó, nhưng tôi không đánh giá cao bạn gọi tôi là một schlub. Nếu bạn không thể giúp đỡ, hãy giữ những lời khuyên của bạn cho chính mình. – abc

+1

Tôi cũng là schlub nghèo, những người thường phải đọc lại mã của riêng tôi vào một ngày sau đó. Tôi xin lỗi bạn đã nhận xét cá nhân của tôi, vì nó là chung chung, có ý định được phần nào tự ti, và chắc chắn nhất ** không ** dự định xúc phạm. Phần lớn tiểu sử của tôi là tiểu thuyết, ngoài việc tôi còn quá dài. – msw

Trả lời

2

Đây có lẽ là tốt nhất Redirection Tutorial Tôi đã tìm thấy. Bất cứ khi nào tôi thấy một số chuyển hướng sôi nổi xảy ra, tôi đề cập đến điều này để giúp tôi vượt qua nó.

+0

Bài viết rất nhiều thông tin !! Tôi đọc hướng dẫn và thực hiện phân tích. Dưới đây là những gì tôi nhận được: Đối với ls: 0 để thiết bị đầu cuối, 1 đến thiết bị đầu cuối, 2 đến đường ống. Đối với grep: 0 đến đường ống, 1 đến terminal, 2 đến terminal. Đúng ? – abc

3

Chuyển hướng được xử lý lệnh bên ngoài thành lệnh bên trong và trong lệnh từ trái sang phải. Vì vậy, ls -l 2>&1 >&3 3>&- ban đầu được stdout vào đường ống. Sau đó, stderr được chuyển hướng đến đường ống, stdout trở thành stdout gốc (chưa được giải nén) và fd thừa được đóng lại. Vì vậy, đầu ra thường xuyên của ls -l vẫn không thay đổi, các dòng của đầu ra lỗi có chứa "xấu" được gửi tới stdout và phần còn lại của đầu ra lỗi bị loại bỏ.

+1

Cảm ơn nhưng: Cách này 'exec 3> & 1' lưu giá trị hiện tại của giá trị xuất chuẩn? Dòng 1 gán fd 3 đến fd 1 và sau đó trong dòng thứ hai fd 1 được gán cho fd 3? Điều đó nghĩa là gì ? Tôi không hiểu. lý do tại sao đóng fd 3 hai lần trong dòng thứ hai? – abc

+1

fd 3 được đóng hai lần vì mỗi một trong hai quy trình mới có bản sao riêng của nó – jilles

+0

Tôi đọc hướng dẫn và thực hiện phân tích. Dưới đây là những gì tôi nhận được: Đối với ls: 0 để thiết bị đầu cuối, 1 đến thiết bị đầu cuối, 2 đến đường ống. Đối với grep: 0 đến đường ống, 1 đến terminal, 2 đến terminal. Đúng ? – abc