2009-04-18 8 views

Odpowiedz

7

tee jest zwykle używana do dzielenia danych wyjściowych programu, tak aby można było wyświetlać i zapisywać w pliku. Polecenie może być użyte do przechwytywania pośrednich wyników zanim dane zostaną zmienione przez inne polecenie lub program. Polecenie tee odczytuje standardowe wejście, a następnie zapisuje jego zawartość na standardowym wyjściu. Go równocześnie kopiuje wynik do określonego pliku (ów) lub zmiennych

tee [OPTION]... [FILE]... 

Na przykład

tee [ -a ] [ -i ]... [ File ]... 
  • -a Dołącza wyjście do końca pliku zamiast pisać nad nim.

  • -i Ignoruje przerwań.

enter image description here

Z sudo i dołączanie do pliku z Twojego przykład w pytaniu

ls -l | sudo tee -a file.txt 
+1

Może, możesz pokazać, jak przekierowujesz wyjście do 'less', kiedy już używasz' sudo'. –

12

tee kopie stdin do stdout (jak cat) i dodatkowo zapisuje wszystko do wskazanego pliku. Używanie go w ten sposób z sudo pozwala przesyłać informacje do trybu uprzywilejowanego i - w tym samym czasie - monitorować, czy odpowiednie rzeczy tam trafiły.

Należy również pamiętać, że ze względu na sposób przekierowania jest obsługiwana w powłoce niemal równoważną

sudo echo "foo bar" > /path/to/some/file 

nie będzie działać, ponieważ przekierowanie byłyby wykonywane przez użytkownika wywołującego, a nie przez użytkownika sudo docelowej .

+0

co jeśli dane standardowe są zbyt duże, w jaki sposób przesyłają dane do pliku? według rozmiaru lub okresu? – Shantesh

0

tee po prostu odzwierciedla wyjście do pliku, który można określić jako argument do tee.

W przypadku pokazywania tee jest nazywany jako superużytkownik (poprzez sudo), a jego jedynym celem jest zapisanie pliku jako superużytkownika zamiast tego, jeśli użytkownik robi echo.

33

tee służy do dzielenia potoku poleceń, umożliwiając zapisanie wyniku polecenia do pliku i wysłanie go wzdłuż potoku. W pierwszym przykładzie daliście ::

echo "foo bar" | sudo tee -a /path/to/some/file 

„foo bar” zostanie powtórzone na standardowe wyjście i załączonym do /path/to/some/file. Pomyśl o trójniku jak o złączu "T" w rurze, dzieląc wyjście na dwie inne rury.

+4

To stąd pochodzi nazwa :-) – Joey

2

Należy pamiętać, że cel tee nie jest ograniczony do zwykłych plików, ale może być do urządzeń, FIFO itp. Można również podłączyć do innego wywołania tee i tak dalej. :-)

1

Uważam, że polecenie tee jest bardzo przydatne w debugowaniu skryptów powłoki, które zawierają długie potoki. Jest to koniec upiornego skryptu powłoki, który jest od dziesięcioleci opóźniony w przepisywaniu w Perlu, ale nadal działa. (To był ostatnio modyfikowany w 1998 roku, jak to się dzieje.)

# If $DEBUG is yes, record the intermediate results. 
if [ "$DEBUG" = yes ] 
then 
    cp $tmp.1 tmp.1 
    cp $tmp.2 tmp.2 
    cp $tmp.3 tmp.3 
    tee4="| tee tmp.4" 
    tee5="| tee tmp.5" 
    tee6="| tee tmp.6" 
    tee7="| tee tmp.7" 
fi 

# The evals are there in case $DEBUG was yes. 
# The hieroglyphs on the shell line pass on any control arguments 
# (like -x) to the sub-shell if they are set for the parent shell. 
for file in $* 
do 
    eval sed -f $tmp.1 $file    $tee4 | 
    eval sed -f $tmp.3      $tee5 | 
    eval sh ${-+"-$-"}      $tee6 | 
    eval sed -f $tmp.2      $tee7 | 
    sed -e '1s/^[ ]*$/[email protected]/' -e '/^[email protected]/d' 
done 

The trzech sed skryptów, które są uruchamiane są upiornie - Nie zamierzam im pokazać. Jest to również przyzwoite użycie eval. Normalne nazwy plików tymczasowych ($ tmp.1, itp.) Są zachowywane przez stałą nazwę (tmp.1, itp.), A wyniki pośrednie są zachowywane w tmp.4 .. tmp.7. Gdybym aktualizował polecenie, użyłbym ""[email protected]#"" zamiast "$*", jak pokazano. I kiedy debuguję to, to jest tylko jeden plik na liście argumentów, więc deptanie plików debugowania nie jest dla mnie problemem.

Zauważ, że jeśli trzeba to zrobić, można utworzyć kilka kopii wejściu w jednym czasie; nie ma potrzeby, aby nakarmić jedną tee polecenia do innego.

Jeśli ktoś potrzebuje, mam wariant tee o nazwie tpipe, który wysyła kopie danych wyjściowych do wielu potoków zamiast wielu plików. Trwa nawet, gdy jeden z potoków (lub wyjście standardowe) kończy się wcześniej. (Zobacz mój profil dla informacji kontaktowych.)

3

Wyjaśnienia dla przypadków

1. eskalacja uprawnień z sudo- i -tee poleceń

Przykład nie chodzi o tylko logika , raczej konwencja. It przedstawia konwencję eskalacji uprawnienia:

echo "Body of file..." | sudo tee root_owned_file > /dev/null 

Przykład ten pokazuje, trójnik wykorzystywane do ominięcia naturalne ograniczenie polecenia sudo. sudo stanie rury standardowego wyjścia do pliku. Przez dumping jego strumienia stdout do /dev/null, możemy również pominąć wyjście lustrzaną w konsoli.

2. poleceniem sudo-komendy vim

Ponieważ można używać sudo komend z vim, można użyć polecenia jeśli zapomniałeś uruchomić jako sudo. Jest to użyteczne w miejscach takich jak /etc/init.d/, gdzie znajdą Państwo tylko do odczytu plików.

Logic z tee-polecenia

To jakby oddziału w Git, albo lepiej, proszę zobaczyć the T analogy by Rick Copeland. Mamy nadzieję, że zmodyfikowany przykład (original) pomaga zrozumieć jego zastosowanie:

curl "http://en.wikipedia.org/wiki/Pipeline_(Unix)" | tee original_site | sed 's/[^a-zA-Z ]/ /g' | tr 'A-Z ' 'a-z\n' | grep '[a-z]' | sort -u | comm -23 - /usr/share/dict/words 
0

polecenia tee po prostu tworzy N + 1 nie plików, 1 kopia przekazywane do stdout i innych do argumentów przedstawionych na tee (tj plików) gdzie N : liczba przekazanych jednostek do