Bash/Initialisierung und Konfiguration

Aus Foxwiki

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:
  1. Im Beispiel existiert im aktuellen Verzeichnis einzig eine Datei ".foo"#
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

  1. .bash_login
  2. .bash_logout
  3. .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.
MAIL 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:

  1. Erstellen Sie drei Variablen, VAR1, VAR2 and VAR3; initialisieren Sie diese so, dass sie die Werte "dreizehn", "13" und "Herzlichen Glückwunsch" enthalten.
  2. Lassen Sie sich den Inhalt der drei Variablen anzeigen.
  3. Sind diese Variablen lokale oder globale Variablen?
  4. Löschen Sie die VAR3.
  5. Können Sie die übrigen zwei Variablen in einem neuen Terminal-Fenster sehen?
  6. Verändern Sie die Datei /etc/profile so, dass alle Anwender begrüßt werden. Testen Sie das.
  7. 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.
  8. 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.
  9. 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-Page

Intern

Weblinks

Kontrollfragen

Testfrage 1

Antwort1

Testfrage 2

Antwort2

Testfrage 3

Antwort3

Testfrage 4

Antwort4

Testfrage 5

Antwort5