Tips en Trucs 2015

Tee

De tee opdracht is een basisopdracht die je op elk systeem zou moeten staan, toch is het niet populair. Deze opdracht leest de standaard invoer en schrijft deze naar de standaard uitvoer en één of meer bestanden, waardoor zijn invoer gedupliceerd wordt. Het wordt vooral gebruikt met pipes en filters. De opdracht dankt zijn naam aan de T-splitter uit de loodgieterij.

In het kort, als je de uitvoer van om het even welke opdracht wilt doorsturen naar een andere opdracht en het scherm, dan biedt tee een oplossing.

Praktische voorbeelden

Zo stel je een tee opdracht samen:

tee [ -a ] [ -i ] [ Bestand ... ]

De twee tee opties betekenen:

-a
Voegt (Append) de uitvoer toe aan het einde van het bestand, i.p.v. het bestand te overschrijven.
-i
Negeert onderbrekingen (Interrupts)

Een tee opdracht ziet er dus zo uit:

opdracht | tee logbestand

Deze regel voert het programma opdracht uit. Alle uitvoer wordt doorgestuurd naar het bestand logbestand terwijl het wordt weergegeven op het standaard uitvoerapparaat (stdout).

Enkele complexere en hopelijk bruikbare voorbeelden:

  1. Gebruik tee om de uitvoer naar meer dan één proces te sturen (pipe).
    dany@new-host-2:~> echo "tee kan een pipe in twee splitsen"|tee >(rev) >(tr ' ' '_')
    tee kan een pipe in twee splitsen
    nestilps eewt ni epip nee nak eet
    tee_kan_een_pipe_in_twee_splitsen

    Je kunt tee dus gebruiken om de uitvoer voor verdere verwerking naar meerdere processen te sturen. Nog leuker wordt het als je nog >() onderdelen toevoegt.

  2. Sla als gewone gebruiker een bestand op als root.
    dany@new-host-2:~> sudo cp /etc/passwd .
    dany@new-host-2:~> vim passwd

    Vanzelfsprekend testen we dit op een kopie uit (eerste opdracht). Daarna gebruiken we als gewone gebruiker de teksteditor vim om het paaswd bestand aan te passen. Na de aanpassingen, sla je deze als root op door in vim de volgende opdracht uit te voeren:

    :w !sudo tee %
    Opslaan als root met tee

    In vim betekent dit:

    :w
    Opslaan (Write)
    !sudo
    Voer de sudo opdracht uit
    tee
    Stuur de uitvoer van vim door naar
    %
    Het huidige bestand

    Na deze opdracht is het aangepaste bestand opgeslagen en kan je de teksteditor veilig verlaten. Aangezien dit een test was, verwijderen we ons testbestand.

    dany@new-host-2:~> sudo rm passwd
  3. Een schijf naar verschillende schijven tegelijk kopiëren:
    dd if=/dev/sda | tee >(dd of=/dev/sdb) | dd of=/dev/sdc

    Als je schijven moet dupliceren, start je met een liveCD en schrijf je met bovenstaande opdracht twee schijven tegelijk. Om nog efficiënter te kopiëren, gebruik je dd met een grotere block size:

    dd if=/dev/sda bs=64k | tee >(dd of=/dev/sdb bs=64k) | dd of=/dev/sdc bs=64k

    Om nog meer kopieën te maken, voeg je extra argumenten aan tee toe:

    dd if=/dev/sda | tee >(dd of=/dev/sdb) >(dd of=/dev/sdc) >(dd of=/dev/sdd) | dd of=/dev/sde
  4. Voer een opdracht op verschillende computers tegelijk uit via SSH. Er zijn verschillende hulpprogramma's om dit te verwezenlijken, een eenvoudige manier is:
    echo “uptime” | tee >(ssh host1) >(ssh host2) >(ssh host3)
  5. Terminal scherm doorsturen met script en tee. Met behulp van de script opdracht kan je opdrachten en hun uitvoer naar een andere gebruiker op een andere terminal sturen, bijvoorbeeld pts/3.
    script /dev/null | tee /dev/pts/3