Альтернатива команде tee без STDOUT

14117
aef

Я использую, | sudo tee FILENAMEчтобы иметь возможность писать или добавлять в файл, для которого права суперпользователя требуются довольно часто.

Хотя я понимаю, почему это полезно в некоторой ситуации, которая teeтакже отправляет свой вклад в STDOUT, я никогда не использовал эту часть teeдля чего-либо полезного. В большинстве случаев эта функция приводит к тому, что мой экран заполняется нежелательным дрожанием, если я не делаю дополнительный шаг и вручную отключаю его tee 1> /dev/null.

Мой вопрос: есть ли команда arround, которая делает то же самое tee, но по умолчанию ничего не выводит в STDOUT?

29
Если вы замените `tee` на` cat> filename`, получите ли вы нужные результаты? sawdust 11 лет назад 0
`cat` не пишет в файлы сам по себе. И оператор `>` не работает, так как файлы не доступны для записи моим текущим пользователем. Так что нет, это не поможет. И, пожалуйста, прекратите полностью изменять значение вашего комментария каждые 2 секунды. Сделайте новый вместо этого. aef 11 лет назад 2
Если вы замените `| sudo tee FILENAME` с `| sudo cat> filename`, вы получаете результаты, которые хотите? sawdust 11 лет назад 0
Нет, оператор `>` использует текущего пользователя оболочки для записи в файл. Этот пользователь не имеет необходимых разрешений. `cat` совершенно бесполезен для этого. aef 11 лет назад 2
Также см. Http://stackoverflow.com/questions/82256/how-do-i-use-sudo-to-redirect-output-to-a-location-i-dont-have-permission-to-wr Joachim Breitner 10 лет назад 2

6 ответов на вопрос

22
Joachim Breitner

Another option that avoids piping the stuff back and then to /dev/zero is

sudo command | sudo dd of=FILENAME 
Именно то, что я искал. Большое спасибо. aef 10 лет назад 0
http://superuser.com/a/850294/68284 описывает дополнительные опции `oflag = append conv = notrunc` для использования` dd` для добавления. aef 8 лет назад 2
3
Curt

The dd solution still prints junk to 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 

That can be avoided using the status option:

command | sudo dd status=none of=FILENAME 

Another interesting possibility (for Linux anyway):

command | sudo cp /dev/stdin FILENAME 

To copy TTY input into a file, I often do this:

sudo cp /dev/tty FILENAME 

It's too bad tee doesn't have an option to suppress stdout.

2
Luca Stein

Вы могли бы использовать скрипт. Т.е. положить что-то подобное в ie $HOME/bin/stee, 0teeили аналогично:

#!/bin/bash  argv= while [[ "$1" =~ ^- ]]; do argv+=" $1" shift done  sudo tee $argv "$1" > /dev/null 

#!/bin/bash  sudo tee "$@" > /dev/null 

Сделайте это выполнимым:

$ chmod 755 stee

Теперь сделайте то есть:

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

Написание сценария и его развертывание на всех системах, над которыми я работаю, не совсем то, что я хотел, но пока кто-то не назовет уже существующий инструмент, я думаю, что я пойду с вашим решением. aef 11 лет назад 0
В самом деле. Хотел бы увидеть это сам. Я давно написал программу на C, которая сделала то, что вы просите, но она давно забыта. Там было почти нет интереса к нему, когда. Но с другой стороны, я не особо рекламировал это. Luca Stein 11 лет назад 1
1
Thunderbeef

Вы можете заключить всю команду в sudo, поэтому сама оболочка и перенаправления выполняются следующим образом root:

sudo sh -c 'do_something > FILENAME' 
-1

Для этого не существует программы (это единственный случай, когда это будет полезно), но вы можете легко написать свою собственную. Если вы не хотите программировать, вы также можете написать простой скрипт, который делает то же самое: cat > $1. Это отличается от помещения его в строку (как предложено опилками), потому что sudo будет применяться ко всему сценарию, включая перенаправление.

-2
Juan Camilo Gomez Martinez

Я знаю, что уже слишком поздно, но что я делаю в таких случаях (когда нужен «плоский» стандартный вывод, но также и временный файл):

tee whatever | grep -v "" 
Можете ли вы подробнее рассказать, что делает эта команда? Vylix 6 лет назад 0
То же, что и tee> / dev / null, но вместо этого используется конвейер для grep, который ничего не соответствует. 00prometheus 6 лет назад 0
Это звучит даже более отвратительно, чем перенаправление вывода в `/ dev / null`, и не делает команду короче. В чем было бы преимущество использования этого вместо оригинального метода? waldyrious 5 лет назад 0

Похожие вопросы