Tips en Trucs 2021

Eigen terminal opdrachten met alias

Een alias gebruik je om aan de Bash terminal opdrachten toe te voegen of aan te passen. Om ze automatisch te activeren kan je ze toevoegen aan het bestand $HOME/.bashrc, $HOME/bash_aliases of in openSUSE Leap 15.2 aan $HOME/.alias.

De meeste distributies voorzien het systeem reeds van populaire aliassen, die je met de volgende opdracht kunt weergeven:

dany@pindabook:~> alias
alias +='pushd .'
alias -- -='popd'
alias ..='cd ..'
alias ...='cd ../..'
alias aumix='padsp aumix'
alias beep='echo -en "\007"'
alias cd..='cd ..'
alias dir='ls -l'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias ip='ip --color=auto'
alias l='ls -alF'
alias la='ls -la'
alias ll='ls -l'
alias ls='_ls'
alias ls-l='ls -l'
alias md='mkdir -p'
alias o='less'
alias rd='rmdir'
alias rehash='hash -r'
alias sox='padsp sox'
alias timidity='timidity -Oe'
alias unmount='echo "Error: Try the command: umount" 1>&2; false'
alias you='if test "$EUID" = 0 ; then /sbin/yast2 online_update ; else su - -c "/sbin/yast2 online_update" ; fi'

Uit deze lijst kan je afleiden, dat bij het uitvoeren van een ls opdracht eigenlijk de _ls wordt uitgevoerd. Om het verschil met de oorspronkelijke ls opdracht te zien kan je de volgende opdrachten uitvoeren:

alias

Met de opdracht unalias kan je een bestaande alias vernietigen. Om de vernietigde alias terug te herstellen, kan je deze opnieuw aanmaken met:

dany@pindabook:~> alias ls='_ls'

Zolang de alias in openSUSE Leap 15.2 niet aan het bestand $HOME/.alias (of een ander Bash opstartscript) werd toegevoegd, kan je om de standaard aliassen te herstellen de terminal afsluiten en opnieuw opstarten. Handig om aliassen te testen.

Sorteren op grootte

Om een bestandslijst gesorteerd op grootte weer te geven, kan je de volgende alias definiëren:

dany@pindabook:~> alias lt='ls --human-readable --size -1 -S --classify'
dany@pindabook:~> lt
totaal 3,2G
2,8G volumio-2.873-2021-02-19-pi.img
386M volumio-2.873-2021-02-19-pi.img.zip
4,0K bin/
4,0K Bureaublad/
4,0K Downloads/
4,0K Kodi/
4,0K venv/
4,0K konsole.txt
4,0K openSUSE-Leap-15.2-NET-x86_64.iso.sha256
4,0K du-rapport.txt
4,0K substring.sh
4,0K datums.txt
4,0K distros.txt
4,0K distros_gesorteerd.txt
   0 Afbeeldingen@
   0 Sjablonen@
   0 Openbaar@
   0 Video's@
   0 Muziek@
   0 Documenten@

De lt alias gebruikt de ls opdracht met opties zodat de bestanden op bestandsgrootte gesorteerd worden en in één kolom worden weergegeven. Na de bestandsnaam verschijnt een extra teken om het soort bestand (map, koppeling, enz.) weer te geven.

Een variant toont eveneens de grootte van de aanwezige mappen:

dany@pindabook:~> alias lt='du -sh * | sort -h'
dany@pindabook:~> lt
0       Afbeeldingen
0       Documenten
0       Muziek
0       Openbaar
0       Sjablonen
0       Video's
4,0K    bin
4,0K    datums.txt
4,0K    distros_gesorteerd.txt
4,0K    distros.txt
4,0K    du-rapport.txt
4,0K    konsole.txt
4,0K    openSUSE-Leap-15.2-NET-x86_64.iso.sha256
4,0K    substring.sh
8,0K    Bureaublad
13M     venv
386M    volumio-2.873-2021-02-19-pi.img.zip
2,8G    volumio-2.873-2021-02-19-pi.img
3,6G    Kodi
17G     Downloads

De gekoppelde schijven weergeven

Vroeger kon je met de mount opdracht snel een lijst van gekoppelde bestandssystemen opvragen. Computers hadden toen weinig USB poorten en partities op schijven waardoor de uitvoer overzichtelijk was. Vandaag zijn computersystemen veel complexer door LVM, meerdere schijven, netwerkopslag en virtuele bestandssystemen waardoor de uitvoer van de mount opdracht een echte puzzel wordt:

dany@pindabook:~> mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=4016004k,nr_inodes=1004001,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/unified type cgroup2 (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
efivarfs on /sys/firmware/efi/efivars type efivarfs (rw,nosuid,nodev,noexec,relatime)
none on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
/dev/sda4 on / type ext4 (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=36,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=2866)
mqueue on /dev/mqueue type mqueue (rw,relatime)
/dev/sda7 on /usr/home/Documents type ext4 (rw,relatime,stripe=32721,data=ordered)
/dev/sda7 on /srv/www/htdocs type ext4 (rw,relatime,stripe=32721,data=ordered)
/dev/sda2 on /boot/efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=805268k,mode=700,uid=1000,gid=100)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=100)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)

Met de volgende alias los je dit probleem op:

dany@pindabook:~> alias mnt="mount | awk -F' ' '{ printf \"%s\t%s\n\",\$1,\$3; }' | column -t | egrep ^/dev/ | sort"
dany@pindabook:~> mnt
/dev/sda2   /boot/efi
/dev/sda4   /
/dev/sda7   /srv/www/htdocs
/dev/sda7   /usr/home/Documents

Voor een uitgebreidere versie gebruikt je:

dany@pindabook:~> alias mnt='mount | grep -E ^/dev | column -t'
dany@pindabook:~> mnt
/dev/sda4  on  /                    type  ext4  (rw,relatime)
/dev/sda7  on  /usr/home/Documents  type  ext4  (rw,relatime,stripe=32721,data=ordered)
/dev/sda7  on  /srv/www/htdocs      type  ext4  (rw,relatime,stripe=32721,data=ordered)
/dev/sda2  on  /boot/efi            type  vfat  (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)

Een vroeger uitgevoerde opdracht opzoeken

Soms ontdek je hoe iets in de terminal werkt en denk je dat je de gevonden oplossing eeuwig zult onthouden. Een uur later ben je vergeten hoe je het deed, klinkt dit bekend?

De Bash geschiedenis doorzoeken is dan een geschenk uit de hemel. Met Ctrl+r kan je in de Bash geschiedenis zoeken, maar dan moet je nog wel de exacte opdracht kennen.

De volgende alias maakt het allemaal wat eenvoudiger:

dany@pindabook:~> alias gh='history|grep'
dany@pindabook:~> gh bash
  456  cat /etc/bash.bashrc | grep alias
  457  cat /etc/profile.d/alias.bash 
  460  cat .bashrc 
  461  cat /etc/profile.d/alias.bash 
  462  cat /etc/profile.d/alias.bash exit
  587  cat .bashrc 
  933  cat .bashrc 
  944  gh bash
  971  cat .bashrc 
 1002  gh bash

Sorteren op laatst gebruikt

Ben je na het weekend vergeten waaraan je vrijdag hebt gewerkt, dan is een lijst met onlangs gebruikte bestanden handig. Met de ls opdracht maak je een alias om te achterhalen waaraan je werkte:

dany@pindabook:~> alias left='ls -t -1'
dany@pindabook:~> left
venv
Downloads
Kodi
volumio-2.873-2021-02-19-pi.img.zip
volumio-2.873-2021-02-19-pi.img
konsole.txt
datums.txt
substring.sh

Indien gewenst kan je meer details weergeven door de gebruikte ls opdracht met de optie --long aan te vullen.

Bestanden in mappen tellen

Als je het aantal bestanden in een map wilt tellen, gebruik je de klassieke ls opdracht met de optie om de bestanden in één kolom weer te geven. De uitvoer van deze ls opdracht geef je daarna door (pipe) aan wc (word count) om het aantal regels in de uitvoer te tellen.

Dit is een schoolvoorbeeld van de UNIX filosofie waarbij gebruikers zelf oplossingen kunnen bouwen door kleine systeem componenten te gebruiken.

De volgende alias vereenvoudigt het proces:

dany@pindabook:~> alias count='find . -type f | wc -l'
dany@pindabook:~> count
25930

Deze alias telt bestanden, negeert mappen, maar niet de inhoud ervan.

Groeibalk

Iedereen maakt grapjes over de onnauwkeurigheid van groeibalken. En toch willen we ze zien. De cp opdracht heeft geen groeibalk, maar heeft wel de -v optie (verbosity) waarbij de naam van elk gekopieerd bestand wordt weergegeven. Leuk, maar het werkt niet als je één groot bestand kopieert.

De pv opdracht toont wel een groeibalk tijdens het kopiëren, maar is niet standaard geïnstalleerd. De rsync opdracht daarentegen is bijna in alle POSIX systemen standaard aanwezig. En wordt aanzien als één van de slimste manieren om bestanden zowel lokaal als tussen computers te kopiëren.

En het heeft een ingebouwde groeibalk:

dany@pindabook:~> alias cpv='rsync -ah --info=progress2'
dany@pindabook:~> cpv volumio-2.873-2021-02-19-pi.img test.img
          2.94G 100%  113.67MB/s    0:00:24 (xfr#1, to-chk=0/1)

Een aangename nevenverschijnsel van deze opdracht is dat rsync zowel mappen als bestanden kopieert. De cp kopieert enkel mappen met de -r optie.

Terminal Prullenbak

De rm opdracht verwijdert het bestand onmiddellijk van de schijf. Grafische omgevingen gebruiken een Prullenbak.

POSIX maakt het eenvoudig, Trash (Prullenbak) is een toegankelijke map in het bestandssysteem. In Linux vind je die terug op ~/.local/share/Trash.

De volgende eenvoudige alias verplaatst bestanden naar deze Trash map:

dany@pindabook:~> alias tcn='mv --force -t ~/.local/share/Trash '
dany@pindabook:~> touch test
dany@pindabook:~> tcn test
dany@pindabook:~> ls ~/.local/share/Trash
directorysizes  files  info  test
dany@pindabook:~> rm ~/.local/share/Trash/test

Zoals je merkt wordt deze map ook nog door andere Prullenbak systemen gebruikt. Om deze niet te storen, moet je bij het ledigen van de "terminal" Prullenbak enkel de met tcn verplaatsen bestanden wissen.

Wil je een robuustere Prullenbak opdracht die samenwerkt met de Prullenbak van de grafische omgeving, kijk dan eens naar Trashy.

Map openen en inhoud bekijken

Meestal wil je na het openen van een map, de inhoud ervan bekijken.

Dit keer maken we geen gebruik van een alias, maar van een functie. Deze kan je eveneens in het .bashrc bestand opnemen om deze automatisch te activeren.

dany@pindabook:~> function cl() {
>     DIR="$*";
>         # indien er geen map wordt opgegeven, gebruiken we de Persoonlijke map
>         if [ $# -lt 1 ]; then
>                 DIR=$HOME;
>     fi;
>     builtin cd "${DIR}" && \
>     # Gebruik hier uw favoriete opdracht
>         ls -F --color=auto
> }
dany@pindabook:~> cl Documenten
Afbeeldingen/  lost+found/  Openbaar/   SNT/           SNTStock.odb    Video's/  VMware/  Webcam streamen
brightness.sh  Muziek/      Sjablonen/  SNT-Stock.odb  Systeembeheer/  vmware/   Web/
dany@pindabook:~/Documenten>

Bij het opnemen van de functie in het .bashrc bestand, moet je de > tekens vooraan de regels niet typen.

Functies zijn veel flexibeler, maar de code moet zinvol zijn en doen wat ervan verwacht wordt. Aliassen zijn bedoeld om eenvoudig te zijn, dus hou ze eenvoudig, maar nuttig. Voor complexere taken schrijf je functies of scripts die je opslaat in een in de PATH variabele aanwezige map.

Met enkel de cd en ls opdrachten is zelfs met eenvoudige aliassen de sky the limit.