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


37

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

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

Моє запитання: чи існує командна команда, яка робить точно те ж саме, що і tee, але за замовчуванням нічого не виводить в STDOUT?


Якщо замінити teeз cat >filename, ви отримаєте результати , які ви хочете?
тирса

4
catне записує у файли сам по собі. І >оператор не працює, оскільки файли не записуються моїм поточним користувачем. Тож ні, це трохи не допомагає. І будь ласка, перестаньте повністю змінювати значення вашого коментаря кожні 2 секунди. Зробіть замість цього нову.
афе

Якщо замінити | sudo tee FILENAMEз | sudo cat >filename, ви отримаєте результати , які ви хочете?
тирса

4
Ні, >оператор використовує поточного користувача оболонки для запису у файл. Цей користувач не має необхідних дозволів. catдля цього абсолютно марний.
афе

Відповіді:


30

Інший варіант , який уникає трубопроводу речі назад , а потім /dev/zeroIS

sudo command | sudo dd of=FILENAME

1
Саме те, що я шукав. Щиро дякую.
aef

4
superuser.com/a/850294/68284 описує додаткові oflag=append conv=notruncпараметри, які слід використовувати ddдля додавання.
афе

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

Ви можете використовувати сценарій. Тобто поставити щось подібне в тобто $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 / корінь / foo


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

2
Справді. Хотілось би це побачити сам. Я довго писав програму в C, яка робила те, що ви просите, але це вже давно минуло і забулося. Коли ще не було інтересу до цього, коли. Але знову ж таки я насправді не дуже її рекламував.
Лука Штейн

2

Ви можете обернути всю свою команду в sudo, тому сама оболонка, а також переадресації виконуються як root:

sudo sh -c 'do_something > FILENAME'

-1

Не існує прямо програми, яка б це зробила (це майже єдиний раз, коли це буде корисно), але ви можете легко написати свою власну. Якщо ви не хочете програмувати, ви також можете написати простий скрипт , який робить те ж саме: cat > $1. Це відрізняється від того, щоб поставити його в рядок (як пропонується тирса), оскільки судо застосовуватиметься до всього сценарію, включаючи перенаправлення.


-2

Я знаю, що це занадто пізно, але те, що я роблю в таких випадках (коли потрібна "плоска" викладка, але також тимчасовий файл):

tee whatever | grep -v ""

Чи можете ви детальніше розібратися, що робить ця команда?
Вилікс

Те саме, що tee> / dev / null, але натомість підключається до грепу, який нічого не відповідає.
00прометей

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