Sommige Bash-opties zijn goed bekend en worden vaak gebruikt. Bijvoorbeeld, velen schrijven aan het begin van een script
set -o xtrace
voor debugging,
set -o errexit
voor het beëindigen bij een fout of
set -o errunset
voor het beëindigen als een aangeroepen variabele niet is ingesteld.
Maar er zijn veel andere opties. Soms zijn ze te verwarrend beschreven in de handleidingen, dus ik heb hier enkele van de meest nuttige verzameld met uitleg.
Opmerking: op Mac kan een oudere versie van bash (3.x in plaats van 4.x) geïnstalleerd zijn, waarin niet al deze opties beschikbaar zijn. In dat geval, zie of .
set of shopt?
Er zijn twee manieren om bash-instellingen in te stellen: vanuit een script of vanuit de commandoregel. U kunt ingebouwde commando's gebruiken set en shopt. Beide wijzigen het gedrag van de shell, doen in veel opzichten hetzelfde (met verschillende argumenten), maar verschillen in hun . De instellingen set worden geërfd of geleend uit de instellingen van andere shells, terwijl de instellingen shopt in bash zijn gemaakt.
Als u de huidige opties wilt bekijken, voert u het volgende uit:
$ set -o
$ shopt Voor het activeren van een optie wordt de lange of korte syntaxis gebruikt: set $ set -o errunset $ set -e
Het effect is hetzelfde.Om een optie uit te schakelen, moet een plus in plaats van een min worden geplaatst:
$ set +e
Lange tijd kon ik deze syntaxis niet onthouden, omdat de logica onjuist lijkt (min activeert de optie, en plus schakelt deze uit).voor het in- en uitschakelen van opties worden (meer logische) vlaggen gebruikt
In shopt (set) en -s (unset): -u $ shopt -s cdspell # <= aan $ shopt -u cdspell # <= uit
Het wijzigen van directoriesEr zijn verschillende opties die helpen bij het werken met directories.
1. cdspell
Met deze instelling begint bash spelfouten te begrijpen en brengt het je naar de map waarvan de naam je met een fout hebt ingetikt.
$ shopt -s cdspell $ mkdir abcdefg $ cd abcdeg abcdefg $ cd ..
Ik heb deze optie jarenlang gebruikt, en zeer zelden (misschien één keer per jaar) neemt ze een heel vreemde beslissing. Maar de rest van de dagen cdspell bespaart tijd, letterlijk elke dag. 2. autocd
Als je niet bereid bent om te dealen met de inefficiëntie van herhaaldelijk invoeren
, dan kun je deze optie instellen om te verplaatsen naar map X, als commando X niet bestaat. cd$ shopt -s autocd $ abcdefg $ cd ..
In combinatie met autocompletion laat dit je snel door mappen springen:$ .\/abc[TAB][RETURN] cd -- .\/abcdefg
Vergeet alleen niet om de map te noemen rm -rf * (ja, dit is mogelijk). 3. direxpand
Dit is een coole optie die omgevingsvariabelen uitbreidt met een druk op de Tab-toets:
Dit is een geweldige optie die de omgevingsvariabelen uitbreidt met een druk op de Tab-toets:
$ shopt -s direxpand
$ .\/[TAB] # wordt vervangen door...
$ \/full\/path\/to\/current_working_folder
$ ~\/[TAB] # wordt vervangen door...
$ \/full\/path\/to\/home\/folder
$ $HOME\/[TAB] # wordt vervangen door...
$ \/full\/path\/to\/home\/folderSchone uitgang
4. checkjobs
Deze parameter stopt de uitgang van de sessie als er op de achtergrond nog taken worden uitgevoerd.
In plaats van uit te loggen, wordt een lijst met niet-voltooide taken weergegeven. Als je toch wilt uitloggen, voer dan nogmaals in exit.
$ shopt -s checkjobs
$ echo $$
68125 # <= Proces-ID voor de shell
$ sleep 999 &
$ exit
Er zijn actieve taken.
[1]+ Running sleep 999 &
$ echo $$
68125 # <= Proces-ID voor de shell hetzelfde
$ exit
Er zijn actieve taken.
[1]+ Running sleep 999 &
$ exit
$ echo $$
$ 59316 # <= deze keer is de Proces-ID veranderdSuperkrachten voor substitutie
5. globstar
Deze optie geeft je superkrachten voor substitutie! Voer in:
$ shopt -s globstar
$ ls **dan zal de shell recursief alle mappen en submappen tonen.
In combinatie met direxpand kun je snel alles onder de hiërarchie bekijken:
$ shopt -s direxpand
$ ls **[TAB][TAB]
Toon alle 2033 mogelijkheden? (y of n) 6. extglob
Deze optie activeert functies die vaker worden geassocieerd met reguliere expressies. Dit kan soms erg nuttig zijn:
$ shopt -s extglob
$ touch afile bfile cfile
$ ls
afile bfile cfile
$ ls ?(a*|b*)
afile bfile
$ ls !(a*|b*)
cfileHier worden patronen tussen haakjes geplaatst en gescheiden door een verticale lijn. Hier zijn de beschikbare operatoren:
? = соответствует нулю или одному вхождению заданных шаблонов ! = показать всё, что не соответствует заданным шаблонам * = ноль или более вхождений + = одно или более вхождений @ = ровно одно вхождение
Bescherming tegen ongelukken
7. histverify
In het begin kan het een beetje eng zijn om de snelle start van commando's uit de geschiedenis te gebruiken met shortcuts !! en !$.
Optie histverify staat je in staat om eerst te bekijken hoe Bash het commando interpreteert, voordat het daadwerkelijk wordt uitgevoerd:
$ shopt -s histverify
$ echo !$ # <= Op Enter drukken start het commando niet
$ echo histverify # <= Het wordt eerst op het scherm getoond,
histverify # <= en daarna uitgevoerd 8. Noclobber
Wederom, ter bescherming tegen ongelukken, namelijk tegen het overschrijven van een bestand dat al bestaat met de herdirectieoperator (>). Dit kan rampzalig zijn als je geen back-up hebt.
Optie set -C verhindert een dergelijk overschrijven. Indien nodig kan de bescherming worden omzeild met de operator >|:
$ touch afile
$ set -C
$ echo something > afile
-bash: afile: kan bestaand bestand niet overschrijven
$ echo something >| afile
$Bron: habr.com
