zsh I / O chuyển hướng: chuyển hướng và sau đó đường ống; chuyện gì đang xảy ra vậy


8

Ai đó có thể giải thích những gì đang xảy ra trong lệnh này:

echo foo >&2 | grep foo

Zsh (5.0.2) in foohai lần. Một dường như để stdout và một để stderr, kể từ khi chạy các lệnh này:

{ echo foo >&2 | grep foo } >/dev/null

và:

{ echo foo >&2 | grep foo } 2>/dev/null

Cả hai chỉ in foomột lần.

Câu trả lời:


5

Đó là tác dụng của MULTIOS .

echo foo >&2 | grep foo

sẽ viết foocho stderr và cũng ống foođến grep. Vì stderr mặc định là terminal, bạn sẽ thấy hai foodòng, một từ echo, một từ grepkết quả.

{ echo foo >&2 | grep foo } >/dev/null

Ở đây, bạn đã thấy một dòng vì thiết bị xuất chuẩn được chuyển hướng đến /dev/null, bạn chỉ thấy foodòng từ echo.

{ echo foo >&2 | grep foo } 2>/dev/null

Ở đây, bạn đã thấy một dòng vì stderr được chuyển hướng đến /dev/null, bạn chỉ thấy foodòng từ grep.

Bạn có thể dễ dàng thấy sự khác biệt trong thiết bị đầu cuối bằng màu đầu ra của dòng. grepsẽ làm nổi bật mẫu phù hợp (hoặc bạn có thể buộc nó bằng cách sử dụng --color=always).


MULTIOSđược bật theo mặc định với nomultiostùy chọn bỏ đặt:

$ unsetopt | grep nomultios
nomultios

Để tắt nó, chỉ cần đặt nomultiostùy chọn:

$ setopt nomultios

Ah, tôi không biết zsh có thể làm điều đó! Tôi (về cơ bản) hiểu chuyển hướng, tôi muốn biết tại sao lệnh không tương đương với {echo foo >&2} | grep foo, nếu bạn thấy những gì tôi đang cố gắng nói. Tôi nghĩ rằng lệnh tôi đã hỏi ở trên sẽ chuyển hướng thiết bị xuất chuẩn sang thiết bị xuất chuẩn và sau đó chuyển thiết bị xuất chuẩn trống sang grep.
Zorawar

@Zorawar: Câu hỏi đó không được giải quyết trong bài viết của bạn, vì vậy tôi sẽ trả lời ở đây. Trong {echo foo >&2} | grep foo, {echo foo >&2}được coi là một lệnh, và nó chạy trong một lớp con. Bạn có thể nghĩ rằng nó thích A | grep foonơi A{echo foo >&2}. Trong trường hợp này, >&2|đã được tách ra, MULTIOSkhông có hiệu lực ở đây.
cuonglm

@Zorawar Trường hợp này là lý do tại sao tôi đã tắt nhiều. Đó là một ý tưởng dễ thương, nhưng trong thực tế tôi thấy nó thường gây phiền nhiễu và hiếm khi hữu ích.
Gilles 'SO- đừng trở nên xấu xa'

@cuonglm, tôi có một câu hỏi khác được hỏi ở đây nhưng không nhận được câu trả lời nào. Nếu bạn biết điều đó và cũng có thời gian, bạn có thể vui lòng giúp đỡ?
Liu Sha
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.