Tips en Trucs 2011

Grafische programma's en de terminal

Programma's met een grafische gebruikersomgeving hebben vele voordelen. Na het starten van zo'n grafisch programma, bieden de menu's en dialoogvenster de mogelijkheden van het programma aan.

Een groot nadeel aan grafische programma's is dat je beperkt wordt door wat de grafische omgeving aanbiedt. Een voorbeeld: hoe kan je een afbeeldingenviewer foto's van vorige maandag in verschillende mappen op uw harde schijf laten weergeven? Je kunt de foto's in een bestandsbeheerder zoals Dolphin opzoeken en deze met de afbeeldingenviewer bekijken, maar wat een monnikenwerk.

Linux gebruikers hebben meer mogelijkheden. Je kunt de meeste programma's met een grafische omgeving starten met argumenten (meestal bestandsnamen) vanuit de terminal. Daardoor kan je de voordelen van de terminal (automatisch aanvullen bestandsnaam, jokers, lussen, enz.), en de krachtige hulpmiddelen zoals find en grep combineren met de grafische gebruikersomgeving van programma's. De opdrachtregel laat zelfs toe opdrachten uit te voeren die niet in de menu's van de grafische omgeving voorkomen.

Laten we beginnen met een paar voorbeelden: je wilt GIMP gebruiken om de foto's met bestandsnamen waarin het woord bloem voorkomt te bewerken. Start Gimp daarvoor op de volgende manier:
gimp Afbeeldingen/*bloem*.jpg

Je hebt foto's met bloemen in sommige van uw 100 submappen, maar je weet niet meer in welke submappen. Je wilt die allemaal bekijken met showFoto. Zo laat je de terminal zoeken naar de bestanden die je daarna doorgeeft aan showFoto:
find -L . -name '*bloem*.jpg' -print0 | xargs -0 showfoto

De opdrachtregel samenstellen

Het eerste woord van een opdrachtregel is meestal de naam van het uit te voeren programma. Dit komt niet steeds overeen met de naam in de menu's van uw desktop (en ze bevatten bijna nooit hoofdletters).

Daarna volgen de opties (argumenten). Elke optie start met een spatie en een of twee min-tekens. Voor een lijst met opties gebruik je de man opdracht of het programma zelf met de optie --help:
dany@Dany-HP:~> man konqueror
Er is geen pagina over konqueror
dany@Dany-HP:~> konqueror --help
Gebruik: konqueror [Qt-opties] [KDE-opties] [KDE-tempbestand-opties] [opties] [URL] 

Webbrowser, bestandsbeheerder en documentviewer.

Algemene opties:
  --help                    Hulp over de opties tonen
  --help-qt                 Qt-specifieke opties tonen
  --help-kde                KDE-specifieke opties tonen
  --help-kde-tempfile       KDE-tempbestand-specifieke opties tonen
  --help-all                Alle opties tonen
  --author                  Auteurinformatie tonen
  -v, --version             Versie-informatie tonen
  --license                 Licentie-informatie tonen
  --                        Einde van de opties

Opties:
  --silent                  Starten zonder standaardvenster, wanneer aangeroepen zonder URL's
  --preload                 Voorladen voor later gebruik. Deze modus ondersteunt geen URL's op de commandoregel
  --profile <profile>       Te openen profiel
  --profiles                Beschikbare profielen tonen
  --sessions                Beschikbare sessies tonen
  --open-session <session>  Te openen sessie
  --mimetype <mimetype>     Mime-bestandstype om te gebruiken voor dit URL-adres, (dus text/html of inode/directory)
  --select                  Voor URL-adressen die verwijzen naar mappen, opent de map en selecteert het bestand, in plaats van het bestand daadwerkelijk te openen

Argumenten:
  URL                       Te openen locatie

Nu heb je een idee hoe de opdrachtregel wordt samengesteld. Zoniet, en het programma voert geen gevaarlijke opdrachten uit (zoals het verwijderen van bestanden), kan je wat experimenteren. Een voorbeeld: hoewel konqueror één enkele URL wil, aanvaardt het programma bestandsnamen (en joker-tekens); de verschillende bestanden worden in verschillende tabbladen geopend. De bestandsnamen (of URL's) worden meestal achteraan de opdrachtregel geplaatst. Om bijvoorbeeld alle bestandsnamen eindigend op .html te openen in een venster van 800x600 onderaan rechts het scherm gebruik je:
konqueror --geometry 800x600-0-0 Documenten/SNT/Linux/Web/*.html

Bij het starten van een grafisch programma via de terminal, opent het venster relatief snel. Als je een nieuwe prompt krijgt (m.a.w. als je een nieuwe opdrachtregel kunt intypen) werkt het programma onafhankelijk van de terminal. Als je geen nieuwe prompt krijgt, wacht de terminal tot het programma wordt afgesloten. In deze gevallen kan je om het programma op de achtergrond te starten na de opdrachtregel een ampersand (&) toevoegen, waardoor je toch een nieuw prompt krijgt:
dany@Dany-HP:~> gimp Afbeeldingen/*bloem*.jpg &
[1] 13855
dany@Dany-HP:~>

Mocht je na het afsluiten van het grafisch programma nog steeds geen nieuwe prompt krijgen, druk dan Ctrl+C om de prompt tevoorschijn te laten komen.

Argumenten en lussen

Hoewel de meeste grafische programma's meerdere bestandsnamen tegelijk accepteren, zijn er limieten. Als je 100 bestanden aan GIMP doorgeeft en er openen 100 vensters is het overzicht zoek. Het één per één openen van de bestanden is in zo'n geval een betere oplossing.

Als de terminal wacht tot het grafisch programma wordt afgesloten, kan een lus zorgen voor het per bestand opstarten van het programma. Om alle html bestanden waarin het woord pinda (met of zonder hoofdletters) te openen in konqueror:
grep -il pinda Documenten/SNT/Linux/Web/*.html | 
> while read file
> do konqueror "$file"
> done

De html bestanden met het woord pinda worden geleverd door grep -il *.html en doorgestuurd (redirect) naar de lus waar konqueror voor elk gevonden bestand wordt opgestart.

Sommige programma's reageren anders en starten een kopie van zichzelf waardoor het oorspronkelijke programma onmiddellijk afgesloten wordt, of het programma wordt een subproces (child) van init (het oerproces van Linux). In deze gevallen worden opnieuw alle vensters in één keer geopend. Je moet op de één of andere manier een pauze inlassen.

Een voorbeeld: je wilt de bestandsbeheerder dolphin starten voor elke map met de naam pinda. De handige opdracht find heeft een -okdir argument waarmee find na elke gevonden map wacht op bevestiging:
dany@Dany-HP:~> find -L . -type d -name pinda -okdir dolphin '{}' \;
find: `./Documenten/lost+found': Toegang geweigerd
< dolphin ... ./Documenten/SNT/Dreamweaver CS5/Web/styles/pinda &gt; ? y
< dolphin ... ./Documenten/SNT/Dreamweaver CS3/Xampp/pinda &gt; ? QPixmap::scaled: Pixmap is a null pixmap
QPixmap::scaled: Pixmap is a null pixmap
y
< dolphin ... ./Documenten/SNT/Dreamweaver CS4/Xampp/pinda > ? QPixmap::scaled: Pixmap is a null pixmap
QPixmap::scaled: Pixmap is a null pixmap
y
< dolphin ... ./Documenten/SNT/Installaties/Squid NT/Oude versie/pinda > ? QPixmap::scaled: Pixmap is a null pixmap
QPixmap::scaled: Pixmap is a null pixmap
y
< dolphin ... ./Documenten/SNT/Installaties/Squid NT/pinda > ? QPixmap::scaled: Pixmap is a null pixmap
QPixmap::scaled: Pixmap is a null pixmap
y
find: `./Documenten/Beveiligd': Toegang geweigerd
find: `./.smolt': Toegang geweigerd
dany@Dany-HP:~> QPixmap::scaled: Pixmap is a null pixmap
QPixmap::scaled: Pixmap is a null pixmap
y
If 'y' is not a typo you can use command-not-found to lookup the package that contains it, like this:
    cnf y
dany@Dany-HP:~>

In dit voorbeeld wordt na het afsluiten van Dolphin geen nieuwe prompt zichtbaar (zie hogerop), nu mag je geen Ctrl-C drukken of de find opdracht wordt afgebroken; typ de bevestiging (y Enter) om de volgende door find gevonden map in Dolphin te openen.

Laten we wat meer hulpmiddelen en mogelijkheden van de terminal gebruiken. We gaan op zoek naar mappen waarin bestanden staan die in het afgelopen jaar aangepast werden en openen deze mappen in Dolphin. Omdat sommige mappen meer dan één gevonden bestand kan bevatten, gebruiken we sed om de bestandsnaam uit het pad te verwijderen (verwijderen van de laatste slash en alle daarop volgende tekens). Daarna voeren we een unieke sortering uit op de resultaten van sed (sort -u) waardoor dubbel voorkomende mappen verdwijnen. Uiteindelijk verwerkt het hulpprogramma voor argumenten xargs de uitvoer van sort regel per regel (-L 1) (regel eindigt op een regeleinde: -d '\n'), en telkens om een bevestiging wordt gevraagd (-p):
dany@Dany-HP:~> find . -type f -mtime +360 -print |
> sed 's@/[^/]*$@@' |
> sort -u |
> xargs -d '\n' -L 1 -p dolphin
find: `./.smolt': Toegang geweigerd
dolphin . ?...y
dolphin ./.adobe/Acrobat/9.0 ?...QPixmap::scaled: Pixmap is a null pixmap
QPixmap::scaled: Pixmap is a null pixmap
y
dolphin ./.adobe/Acrobat/9.0/Cache ?...QPixmap::scaled: Pixmap is a null pixmap
QPixmap::scaled: Pixmap is a null pixmap
...

Voor wie weinig ervaring heeft met opdrachten in de terminal lijkt dit voorbeeld op programmeren. Maar als je eenmaal doorhebt hoe de linux hulpmiddelen (opdrachten) werken, kan je zo'n opdrachtregel binnen de minuut opbouwen. Vanaf dit ogenblik werk je sneller met opdrachten dan met de muis.

Automatisch aanvullen

De meeste terminals hebben een uitgebreide automatisch aanvulling van half ingetypte opdrachten, mapnamen en bestandsnamen, de Tab-toets zorgt voor de aanvulling. Veel grafische omgevingen hebben gelijkaardige mogelijkheden maar zijn beperkt in de mogelijkheden om de te openen bestanden te selecteren (meestal slechts uit één map).

Handige en veel gebruikte opdrachtregels onthouden

Als je een complex en handige opdrachtregel hebt opgebouwd, kan je deze hergebruiken. Gebruik daarbij aliassen om zo'n opdrachtregel een naam te geven. Of gebruik functies om een reeks van opdrachtregels uit te voeren. Groepeer opdrachtregels in een script en neem deze op in de GNOME of KDE menu's. De mogelijkheden zijn werkelijk oneindig.