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


37

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

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

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


Если заменить teeс cat >filename, вы получите результаты , которые вы хотите?
опилки

4
catне пишет в файлы сам по себе. И >оператор не работает, поскольку файлы не доступны для записи моим текущим пользователем. Так что нет, это немного не помогает. И, пожалуйста, прекратите полностью изменять значение вашего комментария каждые 2 секунды. Сделайте новый вместо этого.
августа

Если заменить | sudo tee FILENAMEс | sudo cat >filename, вы получите результаты , которые вы хотите?
опилки

4
Нет, >оператор использует текущего пользователя оболочки для записи в файл. Этот пользователь не имеет необходимых разрешений. catсовершенно бесполезно для этого.
'23

Ответы:


30

Другой вариант, который позволяет избежать возврата материала, а затем /dev/zero-

sudo command | sudo dd of=FILENAME

1
Именно то, что я искал. Большое спасибо.
AEF

4
superuser.com/a/850294/68284 описывает дополнительные oflag=append conv=notruncопции, которые нужно использовать ddдля добавления.
AEF

6

ddРешение до сих пор печатает мусор на стандартный вывод:

$ 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

Этого можно избежать, используя statusопцию:

command | sudo dd status=none of=FILENAME

Еще одна интересная возможность (для Linux в любом случае):

command | sudo cp /dev/stdin FILENAME

Чтобы скопировать ввод TTY в файл, я часто делаю это:

sudo cp /dev/tty FILENAME

Жаль, что у тройки нет возможности подавить стандартный вывод.


4

Вы могли бы использовать скрипт. Т.е. поставить что-то подобное в 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


1
Написание сценария и его развертывание на всех системах, над которыми я работаю, не совсем то, что я хотел, но пока кто-то не назовет уже существующий инструмент, я думаю, что я пойду с вашим решением.
2012 г.

2
Верно. Хотелось бы увидеть это сам. Я давно написал программу на C, которая делала то, что вы просите, но она давно забыта. Там было почти нет интереса к нему, когда. Но с другой стороны, я не особо рекламировал это.
Лука Стейн

2

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

sudo sh -c 'do_something > FILENAME'

-1

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


-2

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

tee whatever | grep -v ""

Можете ли вы подробнее рассказать, что делает эта команда?
Выликс

То же, что и tee> / dev / null, но вместо этого используется конвейер для grep, который ничего не соответствует.
00prometheus

Это звучит даже более отвратительно, чем перенаправление вывода /dev/null, и не делает команду короче. В чем преимущество использования этого метода вместо оригинального?
Вальдериус
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.