Alternatywa dla polecenia tee bez STDOUT


37

Używam, | sudo tee FILENAMEaby móc pisać lub dołączać do pliku, dla którego dość często wymagane są uprawnienia administratora.

Chociaż rozumiem, dlaczego jest to pomocne w niektórych sytuacjach, które teerównież wysyłają swój wkład do STDOUT, nigdy tak naprawdę nigdy nie użyłem tej części teedo niczego użytecznego. W większości sytuacji ta funkcja powoduje, że mój ekran jest wypełniony niechcianymi drganiami, jeśli nie przejdę dodatkowego kroku i nie wyciszę go ręcznie tee 1> /dev/null.

Moje pytanie: Czy istnieje arround komenda, która robi dokładnie to samo, teeale nie ma o niczym domyślnie wyjścia na standardowe wyjście?


Jeśli zastąpi teesię cat >filename, czy można uzyskać wyniki, które chcesz?
trociny

4
catsam nie pisze do plików. A >operator nie działa, ponieważ pliki nie są zapisywane przez mojego bieżącego użytkownika. Więc nie, to trochę nie pomaga. I proszę, przestań całkowicie zmieniać znaczenie komentarza co 2 sekundy. Zamiast tego stwórz nowy.
aef

Jeśli zastąpi | sudo tee FILENAMEsię | sudo cat >filename, czy można uzyskać wyniki, które chcesz?
trociny

4
Nie, >operator używa bieżącego użytkownika powłoki do zapisu do pliku. Ten użytkownik nie ma niezbędnych uprawnień. catjest do tego całkowicie bezużyteczny.
aef

Odpowiedzi:


30

Inną opcją, która pozwala uniknąć przesyłania potoku z powrotem, a następnie do /dev/zerojest

sudo command | sudo dd of=FILENAME

1
Dokładnie tego szukałem. Wielkie dzięki.
aef

4
superuser.com/a/850294/68284 opisuje dodatkowe oflag=append conv=notruncopcje do dddołączania.
aef

6

ddRozwiązanie nadal drukuje śmieci do 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

Można tego uniknąć za pomocą statusopcji:

command | sudo dd status=none of=FILENAME

Kolejna interesująca możliwość (w każdym razie dla Linuksa):

command | sudo cp /dev/stdin FILENAME

Aby skopiować dane wejściowe TTY do pliku, często robię to:

sudo cp /dev/tty FILENAME

Szkoda, że ​​koszulka nie ma opcji tłumienia stdout.


4

Możesz użyć skryptu. Czyli umieścić coś takiego w IE $HOME/bin/stee, 0teelub podobne:

#!/bin/bash

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

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

#!/bin/bash

sudo tee "$@" > /dev/null

Uczyń go wykonalnym:

$ chmod 755 stee

Teraz wykonaj np .:

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


1
Napisanie skryptu i wdrożenie go na wszystkich systemach, na których pracuję, nie jest dokładnie tym, czego chciałem, ale dopóki ktoś nie wymieni istniejącego już narzędzia, myślę, że pójdę z twoim rozwiązaniem.
aef

2
W rzeczy samej. Chciałbym to zobaczyć sam. Napisałem program w C dawno temu, który zrobił to, o co prosiłeś, ale to już dawno minęło i zostało zapomniane. W tamtym okresie nie było zainteresowania. Ale z drugiej strony nie reklamowałem go zbytnio.
Luca Stein,

2

Możesz zawinąć całe polecenie w sudo, więc sama powłoka, jak również przekierowania, są wykonywane jako root:

sudo sh -c 'do_something > FILENAME'

-1

Nie ma bezpośrednio takiego programu (jest to właściwie jedyny raz, kiedy byłby użyteczny), ale możesz łatwo napisać własny. Jeśli nie chcą programu, można także napisać prosty skrypt, który robi to samo: cat > $1. Różni się to od umieszczania go w linii (jak sugerowano trociny), ponieważ sudo będzie dotyczyło całego skryptu, w tym przekierowania.


-2

Wiem, że jest trochę za późno, ale to, co robię w takich przypadkach (gdy potrzebny jest „płaski” standard, ale także plik tymczasowy) to:

tee whatever | grep -v ""

Czy możesz bardziej szczegółowo wyjaśnić, co robi to polecenie?
Vylix,

To samo co tee> / dev / null, ale zamiast tego przesyłanie potokiem do grepa, który nic nie pasuje.
00prometeusz

To brzmi jeszcze bardziej hackersko niż przekierowanie wyjścia /dev/nulli nie powoduje skrócenia polecenia. Jaka byłaby zaleta korzystania z tego zamiast oryginalnej metody?
waldyrious
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.