Bash/Initialisierung und Konfiguration: Unterschied zwischen den Versionen
K Textersetzung - „bzw. “ durch „bzw. “ |
K Textersetzung - „angewendet“ durch „angewandt“ |
||
Zeile 4: | Zeile 4: | ||
|| '''set''' und '''shopts''' sind zwei wichtige eingebaute Kommandos der Bash, mit Hilfe derer sich das Verhalten der Shell auf vielfache Art und Weise konfigurieren lässt. | || '''set''' und '''shopts''' sind zwei wichtige eingebaute Kommandos der Bash, mit Hilfe derer sich das Verhalten der Shell auf vielfache Art und Weise konfigurieren lässt. | ||
Eigentlich eher in den Initialisierungsdateien | Eigentlich eher in den Initialisierungsdateien angewandt, lassen sich beide Kommandos auch interaktiv verwenden. | ||
|- | |- | ||
|} | |} |
Version vom 18. August 2023, 11:09 Uhr
Konfigurationsoptionen
set und shopts sind zwei wichtige eingebaute Kommandos der Bash, mit Hilfe derer sich das Verhalten der Shell auf vielfache Art und Weise konfigurieren lässt.
Eigentlich eher in den Initialisierungsdateien angewandt, lassen sich beide Kommandos auch interaktiv verwenden. |
Beginnen wir mit set und betrachten zunächst den Status der von einer typischen Bash gesetzten Variablen:
$ set -o allexport off braceexpand on errexit off hashall on histexpand on keyword off monitor on noclobber off noexec off noglob off notify off nounset off onecmd off physical off privileged on verbose off xtrace off history on ignoreeof on interactive-comments on posix off emacs on vi off
- Für jede der in obigem Beispiel aufgeführten Variablen kennt set eine "kurze" Option, um diese zu aktivieren (on) bzw. zu deaktivieren.
- Aus der Fülle der Optionen genügt die Kenntnis der schon erwähnten Option -o. Ohne Angabe weiterer Argumente werden alle Variablen (die mit set manipuliert werden können) angezeigt.
- Folgt dieser der (die) Namen einer (mehrerer) Variablen, so wird (werden) diese aktiviert. Zum Deaktivieren dient die Option +o in Verbindung mit einem Variablennamen.
Wichtige Variablen
allexport | Alle Variablen der Shell werden exportiert sobald sie erstellt oder verändert werden. |
braceexpand | Schaltet die Klammernexpansion an bzw. ab. |
hashall | Ist diese Option gesetzt, werden Kommandos, die die Bash bereits einmal gesucht hat (PATH), mit vollständigem Pfad in einer Hashtabelle gespeichert. Dadurch wird ein folgender Aufruf desselben Kommandos erheblich beschleunigt. |
histexpand | Die Möglichkeit des Zugriffs auf zuvor eingegebene Kommandozeilen mittels eines vorangestellten ! wird ein- bzw. ausgeschalten. |
monitor | Durch Deaktivieren wird die Statusmeldung eines im Hintergrund gestarteten Prozesses (»Job«) unterdrückt. In ähnlichem Zusammenhang steht notify, womit der Status eines beendeten Hintergrundprozesses ohne Verzögerung auf dem Bildschirm landet. |
noclobber | Wird diese Variable aktiviert, lassen sich existierende Dateien nicht mittels Ein- und Ausgabeumleitung überschreiben:
$ touch testdatei; ls > testdatei # Alles im grünen Bereich... set +o noclobber' ls > testdatei bash: testdatei: cannot overwrite existing file Wird die Ausgabeumleitung mittels ">|" realisiert, schützt auch "noclobber" nicht vorm Überschreiben. |
noexec | Kommandos werden zwar gelesen, aber nicht ausgeführt. Diese Variable wird gern in der Testphase während der Erstellung von Shellskripten gesetzt. |
noglob | Die Pfadnamensexpansion kann ein- und ausgeschalten werden. |
onecmd | Die Shell wird nach Ausführung des ersten Kommandos beendet. Eine denkbare Anwendung wäre in Verbindung mit Postfächern, wo ein Benutzer sich "von außen" anmeldet, durch ein Skript ein Kommando, das die Mail überträgt, gestartet wird und anschließend der Benutzer automatisch ausgeloggt wird. Damit erhält ein Benutzer niemals vollwertigen Zugang zum Rechner. |
posix | Die Bash verhält sich nach IEEE POSIX P1003.2/ISO 9945.2 Shell und Tools Standard. |
emacs, vi | Schaltet das Verhalten des Kommandozeileneditors auf den jeweiligen Modus. |
Optionen anzeigen
- Einige Bash Optionen wurden schon erwähnt. In diesem Abschnitt sollen die Konfigurationsmöglichkeiten nun etwas genauer betrachtet werden.
- Die Option -o von set zeigt alle Shell-Optionen an
$ set -o allexport off braceexpand on emacs on errexit off hashall on histexpand on history on ignoreeof off interactive-comments on keyword off monitor on noclobber off noexec off noglob off nolog off notify off nounset off onecmd off physical off posix off privileged off verbose off vi off xtrace off
- Vollständige Beschreibung aller Optionen: Info pages, Abschnitt Shell Built-in Commands->The Set Built-in
- Viele der Optionen besitzen eine kurze Aufruf-Option. Beispielsweise kann die Option xtrace auch mit set -x gesetzt werden.
Optionen ändern
- Shell-Optionen können entweder beim Aufruf der Shell als Schalter angegeben werden oder während der Ausführung aktiviert werden. Die umfasst auch die Konfigurationsdateien.
- Das folgende Kommando führt ein Skript im POSIX-Kompatiblen Modus aus:
$ bash --posix script.sh
- Um die aktuelle Umgebung zeitweise zu ändern oder innerhalb eines Skriptes sollte der Befehl set genutzt werden.
- Optionen werden mit einen Minus-Zeichen „-“ (dash) ein- und mit einen Plus-Zeichen „+“ ausgeschaltet:
$ set -o noclobber touch test date > test bash: test: cannot overwrite existing file set +o noclobber date > test
- Das Beispiel zeigt die Option noclobber, die verhindert, dass bestehende Dateien durch Umleitungen überschrieben werden.
- Das Gleiche funktioniert mit einer kurzen Option z. B. -u, die ein unset von Variablen als Fehler behandelt und nicht interaktive Shells beendet, wenn ein solcher Fehler auftritt.
echo $VAR set -u echo $VAR bash: VAR: unbound variable
- Diese Option ist auch nützlich, um eine fehlerhafte Zuweisung zu einer Variablen zu erkennen. Der gleiche Fehler würde auftreten, wenn einer explizit als integer deklarierten Variable eine Zeichenkette zugewiesen würde.
- Das nächste Beispiel zeigt die Option noglob, die verhindert, dass Shell-Sonderzeichen expandiert werden:
set -o noglob touch * ls -l * -rw-rw-r-- 1 willy willy 0 Feb 27 13:37 *
Aktivieren einer Variable mit set -o
set -o allexport noclobber set -o | egrep 'allexport|noclobber' allexport on noglob on
Deaktivieren einer Variable mit set +o
set +o allexport set -o | egrep 'allexport|noclobber' allexport off noglob off
Optionen seit Bash 2.0
Vorsicht abweichende Optionen* Um eine Shellvariable zu aktivieren, ist die Option -s zu verwenden.
- Dem entgegen schaltet -u die Wirkung der Variablen ab.
- So verhilft "-p" zu einem Blick auf den Status der von "shopt" verwalteten Variablen:
$ shopt -p shopt -u cdable_vars shopt -u cdspell shopt -u checkhash shopt -s checkwinsize shopt -s cmdhist shopt -u dotglob shopt -u execfail shopt -s expand_aliases shopt -u extglob shopt -u histreedit shopt -u histappend shopt -u histverify shopt -s hostcomplete shopt -u huponexit shopt -s interactive_comments shopt -u lithist shopt -u mailwarn shopt -u no_empty_cmd_completion shopt -u nocaseglob shopt -u nullglob shopt -s progcomp shopt -s promptvars shopt -u restricted_shell shopt -u shift_verbose shopt -s sourcepath shopt -u xpg_echo
Wichtiger Variablen
cdspell | Ist die Option gesetzt, vermag die Shell geringe Tippfehler in Pfadangaben zu korrigieren:
cd /us/x11R6 bash: cd: /us/x11r6/: Datei oder Verzeichnis nicht gefunden shopt -s cdspell cd /us/x11R6 /usr/X11R6/ |
lithist | Bei der Eingabe von Kommandos, die über mehrere Zeilen gehen, speichert die Bash diese normalerweise ohne die enthaltenen Zeilenumbrüche in der History.
Wenn Sie diese Variable auf "on" setzen, bleiben diese Zeilenumbrüche auch in der History enthalten. |
dotglob | Bei der Pfadnamensexpansion werden Dateien, deren Namen mit einem Punkt beginnen, nur berücksichtigt, wenn diese Variable gesetzt ist:
ls * ls: *: Datei oder Verzeichnis nicht gefunden shopt -s dotglob ls * .foo |
mailwarn | Ist diese Variable gesetzt, überprüft die Bash die Mailboxen auf neue Nachrichten und gibt ggf. eine Mitteilung aus. Die Option korrespondiert mit den Variablen MAIL und MAILPATH. |
interactive_comments | Ist die Option gesetzt, gilt alles, was auf der Kommandozeile einem Doppelkreuz # folgt, als Kommentar |
nocaseglob | Ist diese Option gesetzt, spielt Groß- und Kleinschreibung von Dateinamen für die Bash keine Rolle:
ls.F* ls:.F*: Datei oder Verzeichnis nicht gefunden shopt -s nocaseglob ls -F* .foo |
restricted_shell | Diese Option ist gesetzt, wenn die Bash im restricted Modus gestartet wurde; sie kann nicht geändert werden. |
Die weiteren Variablen sind wohl selten von Nutzen, es sei denn, jemand wünscht gezielt bestimmte Expansionsmechanismen zu deaktivieren.
Konfigurationsdateien
Im Verlauf des ersten Aufrufs arbeitet jede Shell zunächst die Datei /etc/profile ab, in der der Systemverwalter für alle Anwender gültige Kommandos und Variablen eintragen kann.
Daran anschließend sucht die Bash nach einer der folgenden Dateien im Heimatverzeichnis des Benutzers und führt diejenige aus, die zuerst gefunden wird:# .bash_profile
- .bash_login
- .bash_logout
- .profile
Anders verhält es sich jedoch, wenn die Bash nicht als Login-Shell gestartet wird. Dann führt sie ausschließlich die Datei .bashrc aus. Die Ausführung der Dateien lässt sich über zwei Kommandozeilen-Parameter steuern.
Mit dem Parameter -noprofile veranlassen Sie, dass die Bash keine der oben genannten Startdateien ausführt, mit -norc erreichen Sie, dass die persönliche Konfigurationsdatei ~/.bashrc ignoriert wird.
Die Initialisierungsdateien
Handelt es sich bei einer Login-Shell um die Bash oder die Korn Shell, sucht diese als erstes nach der Datei /etc/profile.
Diese wird vom Systemadministrator meist dazu genutzt, allen Nutzern eine auf das System zugeschnittene Umgebung zu gewähren. Häufig enthalten sind: * Prüfen der Mailbox auf neue Nachrichten
- Ausgabe der "Nachricht des Tages" (Inhalt der Datei /etc/motd)
- Setzen wichtiger Aliase
- Vorbelegen wichtiger Variablen
Gerade in Umgebungen, wo Benutzer sowohl auf die Bash, als auch auf die ksh zurück greifen, sollte die /etc/profile sorgfältig erstellt werden, da gewisse Unterschiede zu ungewollten Effekten führen können.
Zwei weitere Konfigurationsdateien sollen rein Bash-spezifische Einstellungen ermöglichen.
Die Dateien .bash_profile und .bash_login im Heimatverzeichnis eines Nutzers werden, falls sie existieren, in beschriebener Reihenfolge behandelt.
Um kompatibel zur kommerziellen Unix-Shell sh zu sein, liest die Bash die beiden Dateien allerdings nicht aus, wenn auf sie unter dem Namen sh (ein Link auf /bin/bash) zugegriffen wird.
Anschließend wertet die Bash noch eine eventuell vorhandene Datei .profile aus, die, wiederum im Heimatverzeichnis eines Nutzers gelegen, erster Ansatzpunkt für den Nutzer darstellt, persönliche Einstellungen zur Umgebung vorzunehmen.
Im Falle einer interaktiven, Nicht-Login Shell versucht die Bash Befehle aus einer Datei ~/.bashrc abzuarbeiten. Schließlich hällt eine nicht-interaktive Bash (Shellskripte) nach einer in der Umgebungsvariablen BASH_ENV gespeicherten Datei Ausschau.
In allen erwähnten Dateien können dieselben Befehle stehen (z. B. Kommandos, Alias- und Variablendefinitionen,...). Abhängig von der konkreten Linuxdistribution werden ggf. aus den beschriebenen Standarddateien heraus weitere Startup-Dateien eingelesen.
Ändern der Shell Konfigurationsdateien
Wenn die Konfigurationsdateien der Shell verändert werden, muss sich der Anwender neu verbinden, damit die Änderungen wirksam werden.
Die veränderte Datei kann auch mit dem Befehl source eingebunden werden, dadurch werden die Änderungen auch für die aktuelle Shell wirksam.
Unterschiedliche Prompts für unterschiedlich Benutzer
Gegen Text austauschen
Die meisten Stellscripte werden in einer privaten Umgebung ausgeführt. Variablen werden nicht vom Subprozess übernommen, wenn sie nicht von der übergeordneten Shell exportiert wurden.
Eine Datei mit Shell-Befehlen per source einzubinden ist ein Weg, um Änderungen oder Variablen in der aktuellen Umgebung wirksam werden zu lassen. Dieses Beispiel zeigt auch, die Nutzung unterschiedlicher Prompts für unterschiedliche Anwender. Der Befehl source resourcefile tut das gleiche, wie . resourcefile.
Sollte unklar sein, aus welcher Datei eine Einstellung stammt, nutzen das Kommando echo um die Scripte zu debuggen.
echo "Now executing .bash_profile.." echo "Now setting PS1 in .bashrc:" export PS1="[some value]" echo "PS1 is now set to $PS1"
Systemweite Konfiguration
/etc/profile
- Wird die Bash interaktiv mit der Option ‑‑login oder als sh aufgerufen wird, liest die die Datei /etc/profile.
- Dort werden üblicher Weise die Shellvariablen PATH, USER, MAIL, HOSTNAME and HISTSIZE gesetzt.
- Auf einigen Systemen wird der Wert für die umask in /etc/profile konfiguriert, auf anderen enthält diese Datei einen Zeiger auf andere Konfigurationsdateien:* /etc/inputrc, die systemweite Konfigurationsdatie für Readline, in der line bell-style eingestellt werden kann.
- Das Verzeichnis /etc/profile.d, dass Dateien für das systemweite Verhalten bestimmter Programme enthält.
- Einstellungen, die für alle Benutzer gelten sollen, werden in dieser Datei festgelegt. Sie könnte wie folgt aussehen:
# /etc/profile # System wide environment and startup programs, for login setup PATH=$PATH:/usr/X11R6/bin # No core files by default ulimit -S -c 0 > /dev/null 2>&1 USER="`id -un`" LOGNAME=$USER MAIL="/var/spool/mail/$USER" HOSTNAME=`/bin/hostname` HISTSIZE=1000 # Keyboard, bell, display style: the readline config file: if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then INPUTRC=/etc/inputrc fi PS1="\u@\h \W" export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC PS1 # Source initialization files for specific programs (ls, vim, less, ...) for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then $i fi done # Settings for program initialization source /etc/java.conf export NPX_PLUGIN_PATH="$JRE_HOME/plugin/ns4plugin/:/usr/lib/netscape/plugins" PAGER="/usr/bin/less" unset i
- Diese Datei setzt einige grundlegende Umgebungsvariablen und einige Variablen, die für Java und Java-Anwendungen benötigt werden.
- Die Bash-Quellen enthalten einige Beispieldateien die, genau wie das Beispiel oben, angepasst werden müssen, damit sie in Ihrer Umgebung funktionieren.
- TODO: Link hinzufügen
/etc/bashrc
- Auf Systemen die unterschiedliche Shell-Typen anbieten, ist es besser Bash-spezifische Einstellungen in einer eigenen Datei festzulegen, da /etc/profile is bereits von anderen Shells, wie z. B. der Bourne Shell.
- Fehler durch Shells, die die Bash-Syntax nicht verstehen, werden vehindet, indem die Konfiguation auf verschiedene Dateien für die verschiedenen Shells aufgeteilt wird.
- In solchen Fällen kann die Benutzerdatei ~/.bashrc die systemweite /etc/bashrc einbinden, um die Shell-Initialisierung beim Login zu starten.
- Es kann auch sein, dass /etc/profile nur die Shell-Umgebung und Einstellungen für den Start von Programmen und /etc/bashrc die systemweite Definition von Shell-Funktionen und Aliasen enthält. Eventuell wird auch /etc/bashrc in /etc/profile oder in einer benutzerspezifischen Initialisierungsdatei referenziert.
- Unter /usr/share/doc/bash-version/startup-files finden sich Beispieldateien. Der folgende Teil stammt aus Bash-Dokumention:
alias ll='ls -l' alias dir='ls -ba' alias c='clear' alias ls='ls --color' alias mroe='more' alias pdw='pwd' alias sl='ls --color' pskill() { local pid pid=$(ps -ax | grep $1 | grep -v grep | gawk '{ print $1 }') echo -n "killing $1 (process $pid)..." kill -9 $pid echo "slaughtered." }
Neben allgemeinen Aliasen enthält sie einige zur Korrektur von Tippfehler und eine Stellfunktion um Prozesse zu beenden.
Benutzerspezifische Konfiguration
Wenn diese Dateien im Home-Verzeichnis nicht vorhanden sind, können sie bei Bedarf erstellt werden.
~/.bash_profile
Das ist die bevorzugte Konfigurationsdatei um die Benutzerumgebung einzurichten. In dieser Datei können Benutzer zusätzliche Optionen setzen oder Standardeinstellungen ändern: .bash_profile
################################################################# # # # .bash_profile file # # # # Executed from the bash shell when you log in. # # # ################################################################# source ~/.bashrc source ~/.bash_login case "$OS" in IRIX) stty sane dec stty erase ;; # SunOS) # stty erase # ;; *) stty sane ;; esac
- Dieser Benutzer hat die Rückschitt-Taste für unterschiedliche Betriebssysteme konfiguriert.
- Außerdem werden die eigenen .bashrc and .bash_login eingelesen.
~/.bash_login
- Diese Datei enthält Einstellungen, die normalerweise nur ausgeführt werden sollen, wenn sich der Benutzer anmeldet.
- Im Beispiel wird die umask gesetzt, eine Liste der angemeldeten Benutzer und ein Kalender des aktuellen Monats ausgegeben:
- Diese Datei wird zuerst gelesen, wenn die Datei ~/.bash_profile fehlt.
####################################################################### # # # Bash_login file # # # # commands to perform from the bash shell at login time # # (sourced from .bash_profile) # # # ####################################################################### # file protection umask 002 # all to me, read to group and others # miscellaneous w cal `date +"%m"` `date +"%Y"`
~/.profile
- Diese Datei wird gelesen, wenn die Dateien ~/.bash_profile und ~/.bash_login fehlen.
- Sie kann die alle Einstellungen enthalten, die andere Shell auch verstehen; andere Shell verstehen unter Umständen die Syntax der Bash nicht.
~/.bashrc
- Heute werden häufig Nicht-Login-Shells benutzt, weil die Shell oft von einer grafischen Oberfläche durch ein Terminal-Fenster gestartet wird. Der Benutzer hat sich bereits grafisch am System angemeldet.
- Die Bash sucht in diesem Fall nach ~/.bashrc, so dass sie in den Dateien referenziert wird, die beim Login eingelesen werden, damit die gleichen Einstellungen nicht mehrmals vorgenommen werden müssen.
- In dieser .bashrc wurden einige Aliase definiert und Variablen für Programme gesetzt, nachdem die systemweite /etc/bashrc eingelesen wurde:
$ cat ~/.bashrc # /home/dirkwagner/.bashrc # Source global definitions if [ -f /etc/bashrc ]; then /etc/bashrc fi # shell options set -o noclobber # my shell variables export PS1="\[\033[1;44m\]\u \w\[\033[0m\] " export PATH="$PATH:~/bin:~/scripts" # my aliases alias cdrecord='cdrecord -dev 0,0,0 -speed=8' alias ss='ssh octarine' alias ll='ls -la' # mozilla fix MOZILLA_FIVE_HOME=/usr/lib/mozilla LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins MOZ_DIST_BIN=/usr/lib/mozilla MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin export MOZILLA_FIVE_HOME LD_LIBRARY_PATH MOZ_DIST_BIN MOZ_PROGRAM # font fix alias xt='xterm -bg black -fg white &' # BitchX settings export IRCNAME="frnk"
~/.bash_logout
Diese Datei enthält Anweisungen, die vor der Abmeldung durchgeführt werden.
Im Beispiel wird das Terminal vor der Abmeldung geleert, aber auch Aufgaben, wie das Kopieren von Dateien, sind denkbar.
.bash_logout
####################################################################### # Bash_logout file # # # # commands to perform from the bash shell at logout time # ####################################################################### clear
Shell-Variablen
- Variablen lassen sich auf verschiedene Art und Weise in konkrete Kategorien einordnen.
- Im Sinne der Shell beeinflussen sie deren Verhalten.
- Diese, in dem Zusammenhang als Umgebungsvariablen bezeichneten Variablen unterteilen sich wiederum in Variablen, die die Bash setzt und solche, die sie nur benutzt.
- Variablen besitzen einen Sichtbarkeitsbereich und lassen sich in lokale und globale Variablen unterteilen.
Wichtige Variablen, die die Bash setzt
BASH | Vollständiger Pfad der aktuellen Bash. In dem Zusammenhang gibt BASH_VERSION die Programmversion preis und BASH_VERSINFO ist ein Feld (5 Einträge) mit genaueren Angaben | |
BASH_ENV | Enthält eine Initialisierungsdatei, die beim Start von Subshells für Skripte aufgerufen wird. | |
HISTFILE | Datei, wo die History bei Ende einer interaktiven Bash gespeichert wird. Wie viele Zeilen diese enthalten kann, steht in HISTFILESIZE. | |
HISTSIZE | Anzahl maximal gespeicherter Kommandos im History -Speicher | |
HOME | Enthält das Heimverzeichnis des Benutzers. | |
HOSTNAME | Rechnername ohne Domain. | |
HOSTTYPE | Architekturtyp des Rechners | |
IFS | Der Internal Field Separator enthält die Trennzeichen, anhand derer die Bash nach erfolgter Expansion die Eingabe in Worte zerlegt. | |
Enthält den Namen einer Mailbox; wenn dort neue Nachrichten eintreffen, wird der Benutzer benachrichtigt. Allerdings nur, falls MAILPATH nicht gesetzt ist. Letztere Variable enthält die Pfade zu mehreren Dateien, die überwacht werden sollen. | ||
OLDPWD | Vorhergehendes Arbeitsverzeichnis; bspw. könnten Sie mit "cd -" in dieses wechseln. | |
OPTARG und OPTIND | Wert und Index des letzten, von getopts bearbeiteten Argument. | |
OSTYPE | Typ des Betriebssystems. | |
PATH | Enthält die Suchpfade, in denen die Bash nach Kommandos sucht. Beachten Sie die Reihenfolge der Suche - bevor die Bash PATH betrachtet, durchsucht sie zunächst die Aliasse, die Funktionen und die eingebauten Kommandos nach dem Namen. | |
PPID | Prozessnummer des Bash-Vorgänger-Prozesses | |
PS1...PS2 | Siehe Prompts | |
PWD | Aktuelles Arbeitsverzeichnis. | |
RANDOM | Erzeugt eine Zufallszahl bei jedem Zugriff. | |
REPLY | Variable, die die zuletzt vom Kommando read gelesene Zeile enthält. | |
SHELLOPTS | Liste der Shelloptionen. | |
TMOUT | Ist dieser Wert gesetzt, beendet sich die Bash, wenn innerhalb der angegebenen Zeitspanne (in Sekunden) keine Eingabe erfolgte. Hiermit kann auf einfache Art und Weise ein Auto-Logout realisiert werden. |
Lokale und globale Variablen
- Lokale Variablen sind nur in der Shell ihrer Definition sichtbar, d.h. in keinem innerhalb der Shell gestarteten Kommando (Ausnahme: builtin-Kommando, aber dieses "ist" ja die Shell selbst).
- Plausibler vorzustellen ist der Sachverhalt innerhalb der Prozesshierarchie. Eine lokale Variable ist somit nur im Prozess ihrer Definition sichtbar, nicht jedoch in den daraus abgeleiteten Prozessen.
- Im Gegensatz hierzu ist eine globale Variable ab dem Prozess ihrer Definition sichtbar; also in allen abgeleiteten, nicht jedoch in den übergeordneten Prozessen.
Definition lokaler Variablen
$ localvar="eine lokale Variable"
Lokale Variablen sind nur in der Shell ihrer Definition sichtbar
bash
echo $localvar exit echo $localvar eine lokale Variable
Definition globaler Variablen
- Jede Variable kann zu einer globalen Variable erklärt werden.
- Globale Variablen sind ab (aber nicht in einer Vorgängershell) der Shell ihrer Definition sichtbar
export localvar
bash echo $localvar eine lokale Variable
Eine letzte Herangehensweise in die Thematik der Variablen betrachtet deren Eigenschaften, ob sie bspw. änderbar sind oder einen bestimmten Typ besitzen (vergleiche Variablen).
Umgebungsvariablen anzeigen (printenv)
- printenv zeigt alle oder einzelne Umgebungsvariablen für Programme.
- Werden kein Variable in der Kommandozeile übergeben, werden alle Umgebungsvariablen ausgegeben.
printenv [Variable ...]
Eingabeaufforderungen (Prompt)
- Arbeitet man interaktiv mit der Bash, zeigt die Shell ihre Bereitschaft zur Entgegennahme von Eingaben anhand eines Prompts ("Eingabeaufforderung") an.
- Vier Prompts werden unterschieden, wobei zwei die Eingabeaufforderung symbolisieren.
Primärer Prompt
Dieses zeigt an, dass die Bash eine neue Eingabe erwartet.
Sekundärer Prompt
- Wurde die Eingabe eines Kommandos nicht vollendet und dennoch versucht, die Zeile durch "ENTER" abzuschließen, zeigt die Bash dieses "Fortsetzungsprompt".
- Typische Situationen, die das Prompt hervorzaubern, sind: der Abschluss einer Zeile mit dem Backslash \, eine vergessene schließende Klammer oder Anführungszeichen:
(echo "Das Zeilenende kam eindeutig [ENTER] > zu zei\[Enter] > tig"[Enter] >)[Enter] das Zeilenende kam eindeutig zu zeitig
Dritter Prompt
- (nur bash) Dieses Prompt erscheint bei der interaktiven Arbeit mit dem builtin-Kommando select und ist über die Shellvariable "$PS3" konfigurierbar.
Vierter Prompt
- (nur bash) Im Debug-Modus (set -x) wird dieses Prompt ("$PS4") vor jeder expandierten Kommandozeile ausgegeben.
- Der Modus ist hilfreich, um zu sehen, wie die Bash eine Eingabe expandiert, bevor sie diese an das Kommando zur Ausführung übergibt:
testvar=text echo $testvar text set -x echo $testvar + echo text text
Das Aussehen der beiden ersten Prompts wird durch den Inhalt der beiden Variablen "$PS1" (primäres Prompt) und "$PS2" (sekundäres Prompt) bestimmt und kann in begrenztem Umfang geändert werden.
Üblicher Inhalt der Variablen
echo $PS1 \u@\h:> echo $PS2 >
"$PS1" enthält offensichtlich Sonderzeichen, die zum Nutzerkennzeichen \u bzw. zum Rechnernamen \h expandieren. Wichtige mögliche Zeichen sind:
\e | Leitet eine Escape-Sequenz ein |
\d | Datum |
\h | Rechnername bis zum ersten enthaltenen Punkt |
\s | Shellname |
\t | Aktuelle Zeit |
\u | Nutzername |
\w | Aktueller Pfadname |
\$ | "#", falls UID=0 und "$" sonst |
\nnn | Die Zahl nnn wird als ASCII-Code interpretiert. So lassen sich auch nichtdruckbare Zeichen und Escape-Sequenzen ("\033" entspricht "\e")verwenden. |
Das folgende Beispiel ändert den primären Prompt, so dass Nutzername, aktueller Pfad und das Datum angezeigt werden:
$ PS1="\u:\w:\d>" user:~:Wed Jun 7>
Vielleicht wäre etwas Farbe für das Prompt noch besser? Mit Escape-Sequenzen lässt sich auch dieses realisieren:
PS1="\[\033[01;31m\]$PS1\[\033[m\]"
Lokalisierung
Zum Anzeigen der Einstellungen
$ locale
- Sie können Umgebungsvariablen setzen, um die Ländereinstellungen des Systems zu steuern.
- Sie können diese Variablen systemweit oder für jede Sitzung definieren.
- Unter AIX und Linux befinden sich diese Variablen in /etc/environment:
Variable | Description |
LC_ALL | Überschreibt alle LC_*-Umgebungsvariablen mit dem angegebenen Wert |
LC_CTYPE | Zeichenklassifikation und Wechsel zwischen Groß- und Kleinschreibung |
LC_COLLATE | Sortierreihenfolge |
LC_TIME | Datums- und Zeitformate |
LC_NUMERIC | Nicht-monetäre numerische Formate |
LC_MONETARY | Monetäre Formate |
LC_MESSAGES | Formate von Informations- und Diagnosenachrichten und interaktiven Antworten |
LC_PAPER | Papierformat |
LC_NAME | Namensformate |
LC_ADDRESS | Adressformate und Standortinformationen |
LC_TELEPHONE | Telefonnummernformate |
LC_MEASUREMENT | Maßeinheiten (metrisch oder anders) |
LC_IDENTIFICATION | Metadaten über die länderspezifischen Informationen |
LANG | Der Standardwert, der verwendet wird, wenn entweder 'LC_ALL' nicht festgelegt oder ein gültiger Wert für 'LC_**' nicht bestimmt wird. |
NLSPATH | Mit Begrenzern versehene Pfadliste für die Suche nach Nachrichtenkatalogen |
TZ | Zeitzone |
Übungen
- Für diese Übung sollte die man-Page von useradd zurate gezogen werden, weil das Verzeichnis /etc/skel genutzt wird, um Standard Shell-Konfigurationsdateien zu speichern.
- Diese werden beim Anlegen eines neuen Anwenders in dessen Home-Verzeichnis kopiert.
Zunächst einige allgemeine Übungen zum Setzen und Anzeigen von Variablen:
- Erstellen Sie drei Variablen, VAR1, VAR2 and VAR3; initialisieren Sie diese so, dass sie die Werte "dreizehn", "13" und "Herzlichen Glückwunsch" enthalten.
- Lassen Sie sich den Inhalt der drei Variablen anzeigen.
- Sind diese Variablen lokale oder globale Variablen?
- Löschen Sie die VAR3.
- Können Sie die übrigen zwei Variablen in einem neuen Terminal-Fenster sehen?
- Verändern Sie die Datei /etc/profile so, dass alle Anwender begrüßt werden. Testen Sie das.
- Setzen Sie für den User root den Prompt mit "Vorsicht!! root arbeitet in \w", bevorzugt in einer grellen Farbe wie rot oder pink oder im invertierten Modus.
- Stellen Sie sicher, dass neu angelegte Benutzer auch einen schönen personalisierten Prompt erhalten, der sie darüber informiert, auf welchem System und in welchem Verzeichnis sie gerade arbeiten. Testen Sie diese Einstellungen, indem Sie sich mit diesem Zugang anmelden.
- Schreiben Sie ein Skript, das zwei integer Variablen akzeptiert. Das Skript soll die Fläche eines Rechtecks mit diesen Abmessungen errechnen. Es sollte ausreichend kommentiert sein und eine ansehnliche Ausgabe erzeugen.
Links
Dateien
Man-Pages
Intern
Weblinks
Kontrollfragen
Testfrage 1
Testfrage 2
Testfrage 3
Testfrage 4
Testfrage 5