Альтернатива команде 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
2
Также см. Stackoverflow.com/questions/82256/…
Иоахим Брейтнер,

Ответы:

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'
Thunderbeef
источник
-1

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


источник
-2

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

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