Arbeitsumgebung einrichten
Einleitung
Welche Einstellung für die Shell mache ich am Besten wo? Wo definiert man die Variable PATH? Wo stellt man die Sprache ein? Fragen über Fragen... auf die es hier hoffentlich eine Antwort gibt.
« zurück (Gesammelte Anleitungen)
Inhalt
Die Konfigurationsdateien der Bourne Again Shell (bash)
Die Datei /etc/environment
Allgemeines
Die Datei /etc/environment
beinhaltet Schlüssel-Werte Paare, d.h. es ist nicht wie /etc/profile
ein Shell-Fragment, in dem man Skripte unterbringen kann (oder besser: soll). Gelesen wird diese Datei von dem
PAM-Modul pam_env.so
, beschrieben in der Manpage pam_env(8)
.
Welche Programme die Datei auslesen, kann man über die folgende Befehlszeile hereusfinden:
$ grep -l pam_env /etc/pam.d/*
Was gehört nicht in diese Datei?
Da die Datei /etc/environment
eine Konfigurationsdatei von PAM ist,
soll diese nicht von fremden Paketen modifiziert werden (z.B. locales). Somit werden Variablen für die Spracheinstellungen in einer separaten Datei
unter /etc/default/locale
festgelegt, z.B. Deutsch mit der Zeichencodierung UTF-8 (Unicode):
LANGUAGE=de_DE:de LANG=de_DE.UTF-8
Die Datei /etc/default/locale
wird ebenfalls von dem PAM-Modul pam_env.so
gelesen, indem der
Pfad zu dieser Datei mit angegeben wird (Bsp: /etc/pam.d/su
):
session required pam_env.so readenv=1 envfile=/etc/default/locale
Somit könnte man also beliebig viele weitere Konfigurationsdateien einlesen lassen.
Die Variable PATH
kann man auch in /etc/environment
definieren, sie wird aber in der Regel von der
Shell wieder überschrieben. Somit ist es besser, PATH
in der Datei /etc/profile
zu definieren
und gegebenenfalls über die benutzerspezifischen Dateien ${HOME}/.bash_profile
(Login-Shell) und
${HOME}/.bashrc
(interaktive Shell) anpassen.
Mehr dazu unter Splitten der Konfigurationsdatei .bashrc
.
Was gehört in diese Datei?
Man kann aber statische Variablen definieren, die für das ganze System von Interesse sind. Als Beispiel werden hier alle Umgebungsvariablen für die Programmiersprache Java definiert, die sowohl für das Ausführen als auch die Entwicklung von Java-Programmen nötig sind.
Außerdem sind noch die Variablen für das Schachprogramm Crafty eingetragen, so dass die Logbuchdateien nicht immer das Heimverzeichnis des
ausführenden Benutzers zumüllen. Hier ist der Inhalt der soeben beschriebenen Datei /etc/environment
:
JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun CLASSPATH=/usr/share/java JDK_PLATFORM=linux JDK_HOME=/usr/lib/jvm/java-1.5.0-sun NB_JDK_HOME=/usr/lib/jvm/java-1.5.0-sun CHESSDIR=/var/lib/games/chess CRAFTY_LOG_PATH=/var/lib/games/chess CRAFTY_BOOK_PATH=/var/lib/games/chess
Splitten der Konfigurationsdatei .bashrc
Die Datei .bashrc
wird von jeder interaktiven Shell, also z.B. einer bash in einem xterm oder der KDE Konsole ausgegführt.
Man definiert Abkürzungen, Umgebungsvariablen und Parameter für die bash. Ein Grungerüst hierfür könnte so aussehen:
# Bash knows 3 diferent shells: normal shell, interactive shell, login shell. # ~/.bashrc is read for interactive shells and ~/.profile is read for login # shells. We just let ~/.profile also read ~/.bashrc and put everything in # ~/.bashrc. # default path if [ -z "$PATH" ]; then PATH=/usr/local/bin:/bin:/usr/bin:/usr/games fi # add home path if not present if [ -d "${HOME}/bin" -a $( echo ${PATH} | grep "${HOME}/bin" | wc -l ) -eq 0 ]; then PATH="${PATH}:${HOME}/bin" fi # fancy colored command prompt PS1="\[\033[1;34m\]\u@\h\[\033[1;31m\](\${SHLVL}:\j)\[\033[0;39m\]:\W$ " export PATH PS1 # ...
Zuerst wird geprueft, ob die Variable PATH
bereits definiert worden ist. Ist das nicht der Fall, wird sie mit einem Standardwert
neu definiert. Anschließend wird noch das bin-Verzeichnis im Heimverzeichnis angehängt, sofern dieses existiert.
Der vordefinierte Prompt (Variable PS1
) kommt mit Farben fetziger daher. Die beiden Zahlen in den runden Klammern bedeuten die
Schachtelungstiefe der aktuellen Shell (Variable SHLVL
) und die Anzahl der Hintergrundjobs.
Anschließend werden die Variablen PATH
und PS1
zum Exportieren gekennzeichnet, d.h. sie werden
an ihre Unterprozesse weitergereicht (vererbt).
Es folgt die Definition von Aliasen, was gesondert in Aliase in eigene Datei auslagern weiter unten behandelt wird.
Weiterhin gibt es ein paar sinnvolle Optimierungen für die Shell selbst:
# ... # configure readline test -e ~/.inputrc && export INPUTRC=~/.inputrc # shell tuning shopt -s cdspell export HISTCONTROL=ignoredups # ...
Die erste Zeile definiert die Variable INPUTRC
mit der Position der Datei ${HOME}/.inputrc
, sofern
diese existiert. Diese Datei konfiguriert die Readline-Bibliothek, die für die Kommandoeingabe der bash verwendet wird. Die unten stehende
Konfigurationsdatei definiert z.B. die Bild-hoch und Bild-runter Taste mit der Kommando-Suchfunktion belegt wird. Diese funktioniert so, dass man den
Anfang der zu suchenden Kommandozeile eingibt und dann nach dem gewünschten Kommando in der History rauf und runtersuchen kann. Die normale
Suchfunktion mit STRG-R ist davon unbeeinträchtigt.
Hier der Inhalt der Datei ${HOME}/.inputrc
:
set input-meta on set convert-meta off set meta-flag on set output-meta on set show-all-if-ambiguous on "\e[5~": history-search-backward "\e[6~": history-search-forward $if term=xterm "\e[H": beginning-of-line "\e[F": end-of-line ## DEL: delete-char $endif "\e[1~": beginning-of-line ##"\e[2~": (einfg-Taste) "\e[3~": delete-char "\e[4~": end-of-line ##"\e[5~": (bild-up-Taste) ##"\e[6~": (bild-down-Taste) #"\e[A": previous-history #"\e[B": next-history #"\e[D": backward-char #"\e[C": forward-char #"\"": self-insert # ###################### #Keypad-Layout: # #\e[2~ \e[1~ \e[5~ #\e[3~ \e[4~ \e[6~ # # # \e[A #\e[D \e[B \e[C ######################
Die Shelloption cdspell
weist die Shell an, bei vertippten Verzeichnisnamen bei dem builtin-Kommando cd
in das wahrscheinlichste Verzeichnis zu wechseln.
Die Variable HISTCONTROL
steuert das Verhalten der Befehlshistorie. Mit dem Schalter ignoredups
werden
keine identischen aufeinander folgenden Kommandos in die History eingetragen (Vermeidung von Duplikaten).
Aliase in eigene Datei auslagern
Aliase sind meist Abkürzungen oder Eingabekorrekturen, die Tipparbeit bedeuten würden. Diese werden der Übersichlichkeit halber in eine
separate Datei ${HOME}/.alias
ausgelagert und nur eingebunden, sofern sie vorhanden ist:
# ... # include alias definitions unalias -a if [ -e "${HOME}/.alias" ]; then . "${HOME}/.alias" fi # ...
Bewegt man sich über Rechnergrenzen hinweg und nutzt dabei dasselbe Heimverzeichnis (z.B. via NFS), kann man speziell für den aktuellen
Host angepasste Aliase einzubinden. Die Umgebungsvariable ${HOSTNAME}
den aktuellen Rechnernamen, den man einfach an den
Dateinamen mit anhängt. so gibt es für jede Arbeitsstation eine eigene Datei, die eingebunden werden kann, sofern sie denn existiert.
Man bindet diese spezifischen Aliase einfach am Ende der Datei ${HOME}/.alias
noch mit ein:
# ... # include host specific aliases if [ -f "${HOME}/.alias.${HOSTNAME}" ]; then . "${HOME}/.alias.${HOSTNAME}" fi
Ein Beispiel, was man in dieser Host-spezifischen Datei definiert sind z.B. SSH-Verbindungen, die je nach Standort des aktuellen Rechners anders aussehen können.