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

« nach oben

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).

« nach oben

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.

« nach oben

« zurück (Gesammelte Anleitungen)