In het draadje
https://forum.ubuntu-nl.org/index.php?topic=109498.0 kwam ter sprake dat ik eens wat over dmenu zou schrijven.
Dmenu is een heel klein programmaatje gemaakt door de mensen van suckless. Het volgt de filosofie van Linux (doe 1 ding) tot in het extreme. Dmenu van zichzelf doet namelijk vrijwel niets. Het enige wat het doet is het accepteren van een lijst via de stdin. Vervolgens geeft dmenu dat weer en kan de gebruiker een item uit de lijst kiezen. De keuze wordt 'gepiped' naar de stdout. Door dit in een bash script te vatten kun je er oneindig veel dingen mee doen als je maar creatief genoeg bent. De bekendste toepassing is als licht gewicht app launcher in veel lichte desktop omgevingen. Dit script wordt automatisch geinstalleerd met dmenu en heet dmenu_run. De werking is vergelijkbaar met de dash in Ubuntu.
Om dmenu te gebruiken moet je het eerst installeren vanuit de Ubuntu repositories met
sudo apt install dmenu
.
Hier volgt een voorbeeld om heel simpel de werking te demonstreren van dmenu.
Om de werking van dmenu te zien zou je het volgende in de commandline kunnen typen:
# de \n betekent een nieuwe regel, zoals in een file.
echo -e "een\ntwee\ndrie\nvier" | dmenu
Je kunt met de cursortoetsen een van de vier opties selecteren en dan op enter drukken. Let op hoe dmenu de gekozen waarde print in de commandline. Dmenu kan dus een gebruiker iets laten selecteren en dat doorgeven aan een volgend programma. Door slimme scriptjes eromheen te maken kun je hier hele nuttige dingen mee doen.
Bijvoorbeeld, een script om een proces te "killen".
Waarschuwing, wees voorzichtig want als je het verkeerde proces killed dan kan je linux crashen en moet je opnieuw opstarten!. Wil je toch niets killen, druk dan op de escape toets die als Cancel werkt of type "Nee" als het scriptje om een bevestiging vraagt:
#!/usr/bin/env bash
lines="-l 20"
selected="$(ps -a -u $USER | \
dmenu -i -p "Zoek process en kill:" \
$lines | \
awk '{print $1" "$4}')";
# killen van een proces kan grote gevolgen hebben
# dus wordt er hier eerst een bevestiging gevraagd
# bij selectie "Nee" gebeurt er niets
if [[ ! -z $selected ]]; then
answer="$(echo -e "Ja\nNee" | \
dmenu -i -p "$selected zal worden gekilled, weet je het zeker?" \
$lines )"
if [[ $answer == "Ja" ]]; then
# vind het ID van het process
selpid="$(awk '{print $1}' <<< $selected)";
kill -9 $selpid # kill het proces
fi
fi
exit 0
Voor de beginneling: kopieer bovenstaande script in een tekst bestand, noem het b.v. kill.sh. Sla dit op in je home. Run het door de commandline te openen in te runnen met
bash kill.sh
Morgen een ander voorbeeld.