Tips en Trucs 2020

Bash tips en trucs

De meerderheid van distributies gebruikt Bash om in de terminal of via scripts opdrachten en taken uit te voeren. Bash is relatief oud (eind jaren 80) en is gebouwd op de fundamenten van nog oudere shell's zoals C shell (csh). Er lopen dan ook heel wat mensen rond met pakken ervaring waarvan we veel kunnen leren.

Alias

Met een alias kan je opdrachten uitvoeren met een verkorte of aangepaste schrijfwijze. Om een overzicht te krijgen van alle aliassen, voer je de volgende opdracht uit:

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 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 blijkt dat ik op mijn systeem de bovenliggende map kan openen met de verkorte alias ... De grep opdracht wordt op dit systeem steeds uitgevoerd met de optie --color=auto.

Je kunt aliassen ook gebruiken om ongelukken te voorkomen. Zo kan je de volgende twee aliassen toevoegen om verplaats en verwijder opdrachten steeds te laten bevestigen:

dany@pindabook:~> alias mv='mv -i'
dany@pindabook:~> alias rm='rm -i'
dany@pindabook:~> touch test.txt
dany@pindabook:~> rm test.txt
rm: leeg normaal bestand 'test.txt' verwijderen? j

Je merkt dat je nu bij een verwijderopdracht moet bevestigen. Deze aliassen blijven werkzaam zolang je de Bash sessie niet verlaat. Als je deze aliassen leuk en/of interessant vindt, plaats je ze in het verborgen .bashrc instellingenbestand. Alle opdrachten die in het .bashrc van uw persoonlijke map staan worden door bash uitgevoerd bij elke start van een bashsessie of -terminal.

Het gebruik van eigen aliassen heeft een keerzijde. Als je op jouw eigen systeem veel aliassen gebruikt, kan je ontwenningsverschijnselen vertonen als je op een ander systeem werkt. Maar dit geldt voor alle persoonlijke instellingen.

Export

Export is vergelijkbaar met alias, maar dan voor variabelen. Zo kan je veel gebruikte en/of steeds terugkerende constante variabelen met export vastleggen. Je krijgt een lijst van export variabelen met de opdracht:

dany@pindabook:~> export
declare -x ALSA_CONFIG_PATH="/etc/alsa-pulse.conf"
declare -x AUDIODRIVER="pulseaudio"
declare -x COLORTERM="1"
declare -x CONFIG_SITE="/usr/share/site/x86_64-unknown-linux-gnu"
declare -x CPU="x86_64"
declare -x CSHEDIT="emacs"
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
declare -x FROM_HEADER=""
declare -x GPG_TTY="/dev/pts/0"
declare -x G_BROKEN_FILENAMES="1"
declare -x G_FILENAME_ENCODING="@locale,UTF-8,ISO-8859-15,CP1252"
declare -x HISTSIZE="1000"
declare -x HOME="/home/dany"
declare -x HOST="pindabook.lan"
declare -x HOSTNAME="pindabook.lan"
declare -x HOSTTYPE="x86_64"
declare -x JAVA_BINDIR="/usr/lib64/jvm/jre-11-openjdk/bin"
declare -x JAVA_HOME="/usr/lib64/jvm/jre-11-openjdk"
declare -x JAVA_ROOT="/usr/lib64/jvm/jre-11-openjdk"
declare -x JRE_HOME="/usr/lib64/jvm/java-11-openjdk-11"
declare -x LANG="nl_NL.UTF-8"
declare -x LESS="-M -I -R"
declare -x LESSCLOSE="lessclose.sh %s %s"
declare -x LESSKEY="/etc/lesskey.bin"
declare -x LESSOPEN="lessopen.sh %s"
declare -x LESS_ADVANCED_PREPROCESSOR="no"
declare -x LIBGL_DEBUG="quiet"
declare -x LOGNAME="dany"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=00;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=41;33;01:ex=00;32:*.cmd=00;32:*.exe=01;32:*.com=01;32:*.bat=01;32:*.btm=01;32:*.dll=01;32:*.tar=00;31:*.tbz=00;31:*.tgz=00;31:*.rpm=00;31:*.deb=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.lzma=00;31:*.zip=00;31:*.zoo=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.tb2=00;31:*.tz2=00;31:*.tbz2=00;31:*.xz=00;31:*.avi=01;35:*.bmp=01;35:*.dl=01;35:*.fli=01;35:*.gif=01;35:*.gl=01;35:*.jpg=01;35:*.jpeg=01;35:*.mkv=01;35:*.mng=01;35:*.mov=01;35:*.mp4=01;35:*.mpg=01;35:*.pcx=01;35:*.pbm=01;35:*.pgm=01;35:*.png=01;35:*.ppm=01;35:*.svg=01;35:*.tga=01;35:*.tif=01;35:*.webm=01;35:*.webp=01;35:*.wmv=01;35:*.xbm=01;35:*.xcf=01;35:*.xpm=01;35:*.aiff=00;32:*.ape=00;32:*.au=00;32:*.flac=00;32:*.m4a=00;32:*.mid=00;32:*.mp3=00;32:*.mpc=00;32:*.ogg=00;32:*.voc=00;32:*.wav=00;32:*.wma=00;32:*.wv=00;32:"
declare -x LS_OPTIONS="-N --color=tty -T 0"
declare -x MACHTYPE="x86_64-suse-linux"
declare -x MAIL="/var/mail/dany"
declare -x MANPATH="/usr/local/man:/usr/local/share/man:/usr/share/man"
declare -x MINICOM="-c on"
declare -x MORE="-sl"
declare -x OLDPWD
declare -x OSTYPE="linux"
declare -x PAGER="less"
declare -x PATH="/home/dany/bin:/usr/local/bin:/usr/bin:/bin"
declare -rx PROFILEREAD="true"
declare -x PWD="/home/dany"
declare -x QEMU_AUDIO_DRV="pa"
declare -x QT_SYSTEM_DIR="/usr/share/desktop-data"
declare -x SDL_AUDIODRIVER="pulse"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_CLIENT="192.168.1.52 41582 22"
declare -x SSH_CONNECTION="192.168.1.52 41582 192.168.1.8 22"
declare -x SSH_SENDS_LOCALE="yes"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="xterm-256color"
declare -x USER="dany"
declare -x WINDOWMANAGER="/usr/bin/startkde"
declare -x XCURSOR_THEME="DMZ"
declare -x XDG_CONFIG_DIRS="/etc/xdg"
declare -x XDG_DATA_DIRS="/home/dany/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share"
declare -x XDG_RUNTIME_DIR="/run/user/1000"
declare -x XDG_SESSION_ID="2"
declare -x XKEYSYMDB="/usr/X11R6/lib/X11/XKeysymDB"
declare -x XNLSPATH="/usr/share/X11/nls"

Een kandidaat om met export te gebruiken is de PS1 variabele. Deze bepaald het uitzicht en de gegevens die in de prompt worden weergegeven. Om ietwat op veilig te spelen, kan je de PS1 variabele backuppen in een andere variabele:

dany@pindabook:~> echo $PS1
\u@\h:\w>
dany@pindabook:~> ps1bak="$PS1"
dany@pindabook:~> echo $ps1bak
\u@\h:\w> 

Mocht het fout gaan, dan kan je het origineel herstellen met:

dany@pindabook:~> PS1="$ps1bak"

De meeste distributies veranderen de weergave van de prompt als je als root werkt en je dubbel zo goed moet opletten. Je kunt de veilige omgeving van de klassieke gebruiker met minder rechten benadrukken door de prompt een groene kleur te geven. Dit gaat met de volgende opdracht:

dany@pindabook:~> PS1="\e[0;32m\u@\h:\w> \e[m"

Wil je op een zwarte achtergrond nog meer contrast, gebruik je helder groen:

dany@pindabook:~> PS1="\e[1;32m\u@\h:\w> \e[m"

Daarbij zorgt het deel \e[1;32m, voor de helder groene tekst en \e[m terug voor de standaard tekstkleur bij het intypen van opdrachten. Meer informatie over kleuren in de PS1 prompt kan je hier vinden.

Bash PS1 kleur

Om een variabele te delen met (beschikbaar te maken voor) andere opdrachten, moet je deze exporteren:

dany@pindabook:~> export PS1="\e[1;32m\u@\h:\w> \e[m"

Nu kunnen andere opdrachten eveneens de waarde van de PS1 variabele gebruiken. Echter alleen in deze bash sessie. Om deze variabele permanent in elke bash sessie te gebruiken plaats je de export opdracht eveneens in het verborgen .bashrc instellingenbestand.

Scripts

Scripts zijn handig om herhalende taken in bash te automatiseren. Een paar vanzelfsprekende maar te weinig toegepaste werkwijzen vereenvoudigen het gebruik van scripts drastisch.