tee stdout để stderr?


17

Tôi muốn gửi thiết bị xuất chuẩn từ một quy trình đến quy trình khác, nhưng cũng đến bảng điều khiển. Gửi stdout đến stdout + stderr, ví dụ.

Ví dụ: tôi đã có git editbí danh như sau:

git status --short | cut -b4- | xargs gvim --remote

Tôi muốn danh sách tên tệp được gửi đến màn hình cũng như xargs.

Vì vậy, có một teetiện ích giống như sẽ làm điều này? Để tôi có thể làm một cái gì đó như:

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote

Câu trả lời:


14

tee có thể nhân đôi với bảng điều khiển hiện tại bằng cách sử dụng tee /dev/tty

git status --short | cut -b4- | tee /dev/tty | xargs gvim --remote

Thay vào đó, bạn có thể sử dụng /dev/stdouthoặc /dev/stderrnhưng chúng có thể được chuyển hướng nếu lệnh của bạn nằm trong tập lệnh. Lưu ý rằng /dev/ttysẽ luôn là bàn điều khiển (và có thể không tồn tại trong vỏ không tương tác). Điều này là sai, đọc các ý kiến.


1
Thật vậy, trong đường ống bạn hiển thị /dev/stdout được chuyển hướng. Đó là, nếu bạn đang sử dụng tee /dev/stdouthiệu ứng thì mọi thứ sẽ được gửi đến xargshai lần và không có gì đi đến thiết bị đầu cuối.
celtschk

/dev/stdoutkhông được chuyển hướng bởi một đường ống, nó sẽ giữ nguyên đầu ra tiêu chuẩn quy trình hiện tại. Tuy nhiên, nếu bạn đóng gói lệnh trong một tập lệnh và sau đó chuyển hướng thiết bị xuất chuẩn của tập lệnh này, thì nó /dev/stdoutsẽ được chuyển hướng. Trong một bảng điều khiển tương tác, tee /dev/ttytee /dev/stdoutcó tác dụng tương tự, ngay cả khi sử dụng đường ống.
Vincent Robert

Nếu bạn không tin tôi, hãy bắt đầu và gõ echo foo | tee /dev/stdout | tr f becho foo | tee /dev/tty | tr f b. Đây là một gợi ý cho bạn: Đó là teethông dịch /dev/stdouttên tệp.
celtschk

2
Bạn nói đúng, tôi không biết làm thế nào tôi bỏ lỡ điều đó. Tôi đã thực hiện một số thử nghiệm trong vỏ của riêng tôi với tty và stdout và bằng cách nào đó tôi đã bỏ lỡ điều đó. Cảm ơn đã làm rõ, tôi đã gỡ bỏ tuyên bố sai.
Vincent Robert

Chà, do stderr không bị ảnh hưởng bởi đường ống, bạn sẽ không cần phải loại bỏ điều đó (tất nhiên là cảnh báo chuyển hướng tập lệnh vẫn còn, nhưng đối với tập lệnh, khả năng chuyển hướng thường sẽ là một thuộc tính mong muốn).
celtschk


3

Bạn có thể sử dụng lệnh tee , chỉ cần cung cấp nó với tệp STDERR, ví dụ:

tee /dev/stderr
tee /proc/self/fd/2

vì vậy trong trường hợp đó bí danh của bạn có thể:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote

1
Tôi nghĩ ý bạn là/proc/self/fd/2
celtschk
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.