Thay thế cho lệnh tee mà không có STDOUT


37

Tôi đang sử dụng | sudo tee FILENAMEđể có thể viết hoặc nối vào một tệp mà các quyền siêu người dùng được yêu cầu khá thường xuyên.

Mặc dù tôi hiểu tại sao nó hữu ích trong một số trường hợp, nhưng điều đó teecũng gửi lại đầu vào của nó cho STDOUT, tôi chưa bao giờ thực sự sử dụng phần đó teecho bất cứ điều gì hữu ích. Trong hầu hết các tình huống, tính năng này chỉ khiến màn hình của tôi bị lấp đầy bởi sự giật hình không mong muốn, nếu tôi không thực hiện thêm bước và tắt tiếng bằng tay tee 1> /dev/null.

Câu hỏi của tôi: Có một arround lệnh, thực hiện chính xác điều tương tự tee, nhưng theo mặc định không xuất ra bất cứ điều gì cho STDOUT?


Nếu bạn thay thế teebằng cat >filename, bạn có nhận được kết quả mà bạn muốn không?
mùn cưa

4
catkhông tự ghi vào tập tin. Và >toán tử không hoạt động vì các tệp không thể ghi được bởi người dùng hiện tại của tôi. Vì vậy, không, điều đó không giúp một chút. Và hãy dừng lại để thay đổi hoàn toàn ý nghĩa bình luận của bạn cứ sau 2 giây. Tạo một cái mới thay thế.
aef

Nếu bạn thay thế | sudo tee FILENAMEbằng | sudo cat >filename, bạn có nhận được kết quả mà bạn muốn không?
mùn cưa

4
Không, >toán tử sử dụng trình bao shell hiện tại để ghi vào tệp. Người dùng này chưa có quyền cần thiết. catlà hoàn toàn vô dụng cho điều đó.
aef

Câu trả lời:


30

Một tùy chọn khác tránh đường ống các công cụ trở lại và sau đó để /dev/zero

sudo command | sudo dd of=FILENAME

1
Chính xác những gì tôi đang tìm kiếm. Cảm ơn rất nhiều.
AEF

4
superuser.com/a/850294/68284 mô tả các oflag=append conv=notrunctùy chọn bổ sung để sử dụng ddđể nối thêm.
vào

6

Các ddgiải pháp vẫn còn in rác để stdout:

$ ls | sudo dd of=FILENAME
0+1 records in
0+1 records out
459 bytes (459 B) copied, 8.2492e-05 s, 5.6 MB/s

Điều đó có thể tránh được bằng cách sử dụng statustùy chọn:

command | sudo dd status=none of=FILENAME

Một khả năng thú vị khác (đối với Linux)

command | sudo cp /dev/stdin FILENAME

Để sao chép đầu vào TTY vào một tệp, tôi thường làm điều này:

sudo cp /dev/tty FILENAME

Đó là tee quá tệ không có tùy chọn để ngăn chặn stdout.


4

Bạn có thể sử dụng một tập lệnh. Tức là đặt một cái gì đó như thế này $HOME/bin/stee, 0teehoặc tương tự:

#!/bin/bash

argv=
while [[ "$1" =~ ^- ]]; do
    argv+=" $1"
    shift
done

sudo tee $argv "$1" > /dev/null

#!/bin/bash

sudo tee "$@" > /dev/null

Làm cho nó thực thi:

$ chmod 755 stee

Bây giờ làm tức là:

$ ls -la | stee -a / root / foo


1
Viết một kịch bản và triển khai nó cho tất cả các hệ thống tôi làm việc không chính xác như những gì tôi muốn, nhưng cho đến khi ai đó đặt tên cho một công cụ đã có sẵn, tôi nghĩ tôi sẽ đi theo giải pháp của bạn.
aef

2
Thật. Tôi muốn nhìn thấy nó bản thân mình. Tôi đã viết một chương trình trong C một thời gian dài đã làm những gì bạn yêu cầu, nhưng đó là một thời gian dài và bị lãng quên. Gần như không có hứng thú cho nó trở lại khi. Nhưng sau đó một lần nữa tôi đã không thực sự quảng cáo nó nhiều.
Luca Stein

2

Bạn có thể gói toàn bộ lệnh của mình vào sudo, do đó, chính shell, cũng như chuyển hướng, được thực hiện như root sau:

sudo sh -c 'do_something > FILENAME'

-1

Không có chương trình trực tiếp để làm điều đó (đây là lần duy nhất nó hữu ích), nhưng bạn có thể dễ dàng tự viết. Nếu bạn không muốn lập trình, bạn cũng có thể viết một tập lệnh shell đơn giản thực hiện điều tương tự : cat > $1. Điều này khác với việc đặt nội tuyến (như mùn cưa được đề xuất) vì sudo sẽ áp dụng cho toàn bộ tập lệnh, bao gồm cả chuyển hướng.


-2

Tôi biết là hơi muộn, nhưng những gì tôi làm trong những trường hợp như vậy (khi thiết bị xuất chuẩn 'phẳng' nhưng cũng cần một tệp tạm thời) là:

tee whatever | grep -v ""

Bạn có thể giải thích thêm những gì lệnh này đang làm?
Vylix

Tương tự như tee> / dev / null, nhưng thay vào đó, đường ống đến một grep không khớp với gì.
00prometheus

Điều đó nghe có vẻ khó khăn hơn là chuyển hướng đầu ra /dev/nullvà không làm cho lệnh trở nên ngắn hơn. Điều gì sẽ là lợi thế của việc sử dụng này thay vì phương pháp ban đầu?
waldyrious
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.