Bash/Builtin

Aus Foxwiki

Beschreibung

Es liegt wohl in der Natur des Linux-Neulings, seine Testprogramme und -skripten «"test« zu benennen (eigentlich kann ich mich an keinen Linuxkurs erinnern, indem nicht mindestens einer der Teilnehmer auf diese Weise mit den builtin Kommandos der Bash konfrontiert wurde).

Nach verrichteter Arbeit zeigte der Testlauf:

ls -l test
-rwxr-xr-x  1   user    users       12177 Sep 23 10:52 test
test

Mit Kenntnis des Vorgehens der Bash bei der Suche nach einem Kommando, gelangt man bald zum Schluss, dass sich ein builtin Kommando vorgedrängelt hat.

Es gibt eine Fülle solcher eingebauter Kommandos und mindestens 4 Gründe, warum solche in der Bash überhaupt existieren: # Weil es ein solches Kommando in Unix nicht gibt (Beispiel "source")

  1. Weil ein builtin Kommando effizienter arbeitet, als ein externes Kommando (keine Prozesserzeugung notwendig; Beispiel »echo«)
  2. Weil nur ein eingebautes Kommando Bash-interne Variablen ändern kann (Beispiel »export«)
  3. Weil ein Kommando wie »exec« nur innerhalb der Bash realisierbar ist

Betrachten wir die einzelnen builtin-Kommandos:

  • Etliche der besprochenen Shell-Kommandos starten nicht, wie sonst üblich, einen eigenen Prozeß, sondern sie werden direkt von der Shell interpretiert und ausgeführt.
  • Teilweise ist keine E/A-Umleitung möglich. Etliche Kommandos der folgenden Auswahl wurden schon besprochen.
  • Andere werden weiter unten behandelt. Zum Teil gibt es interne und externe Versionen, z. B. 'echo' (intern) und '/bin/echo' (extern).
break Schleife verlassen
continue Sprung zum Schleifenanfang
echo Ausgabe
eval Mehrstufige Ersetzung
exec Überlagerung der Shell durch ein Kommando
exit Shell beenden
export Variablen für Subshells bekannt machen
read Einlesen einer Variablen
shift Parameterliste verschieben
trap Behandlung von Signalen
  • Bei der Suche nach Kommandos betrachtet die Shell Aliasse und Funktionen noch vor den eingebauten Kommandos. Überdeckt nun ein solcher Name ein builtin-Kommando, so wird beim einfachen Aufruf immer der Alias bzw. die Funktion ausgeführt werden.
  • Mit vorangestelltem builtin weist man nun die Bash an, auf jeden Fall ihr eingebautes Kommando aufzurufen.
  • Der Rückgabestatus ist gleich dem Rückgabewert des Builtin's oder "falsch", falls das Kommando kein builtin ist.

Null

siehe Linux:Shell:Bash:Builtin:null

source

siehe Linux:Shell:Bash:Builtin:source

alias

  • Dient der Definition einer Abkürzung für ein(e) Kommando(folge).
  • Mit der Option -p werden alle vorhandenen Aliase aufgelistet.

jobs

Listet die Jobnummern aller Hintergrundprozesse auf.

bind

siehe Linux:Shell:Bash:Builtin:bind

break

siehe Linux:Shell:Bash:Builtin:break

cd

siehe Verzeichnis wechseln

command

siehe Linux:Shell:Bash:Builtin:command

compgen

siehe Linux:Shell:Bash:Builtin:compgen

complete

Mit diesem Kommando kann das ganze Verhalten der Bash bei der Vervollständigung von Argumenten verändert werden

continue

siehe Linux:Shell:Bash:Builtin:continue

declare

Zum Deklarieren von Variablen, wobei diese gleichzeitig mit Attributen versehen werden können; siehe unter Variablen

dirs

  • Dient zur Anzeige des Verzeichnisstacks.
  • in Verzeichnis kann neben dem bekannten Kommando cd auch mit dem eingebauten Kommandos pushd bzw. popd gewechselt werden.
  • Bei letzterem Vorgehen wird das Verzeichnis auf einem Stack abgelegt, dessen Einträge popd in umgekehrter Reihenfolge entfernt und in das jeweilige Ausgangsverzeichnis wechselt.

disown

siehe Linux:Shell:Bash:Builtin:disown

echo

Eine Zeile Text anzeigen

enable

  • Die eingebauten Kommandos der Shell lassen sich bei Bedarf aktivieren oder auch abschalten.
  • Letzteres kann nützlich sein, wenn Sie fortwährend auf ein externes Kommando zugreifen müssen, das denselben Namen wie ein Shell-Builtin besitzt.
  • Da die Shell immer ihr eigenes Kommando bevorzugt, müssten Sie ständig den vollständigen Pfad eintippen - auf die Dauer ein lästiges Unterfangen.
  • Mit -n <Kommando> deaktivieren Sie das Builtin; ohne Eingabe einer Option lässt es sich wieder aktivieren.

eval

  • Das Kommando eval liest seine Argumente, wobei die üblichen Ersetzungen stattfinden, und führt die resultierende Zeichenkette als Kommando aus.
  • siehe Linux:Shell:Bash:Builtin:eval

exec

exit

  • Wie schon bei der interaktiven Shell kann auch eine Shell-Skript mit exit abgebrochen werden.
  • Vom Terminal aus kann mit der DEL-Taste abgebrochen werden, sofern das Signal nicht abgefangen wird (siehe trap). Die Syntax der exit-Anweisung lautet wie folgt:
exit [ n ]
  • Die exit-Anweisung wird benutzt, um ein Skript zu beenden.
  • Wenn der Parameter n angegeben wird, wird er von dem Skript als Exit-Code zurückgegeben.
exit [n] 
  • Beendet die Shell (das Shellskript) mit dem angegebenem Rückgabewert.
  • Wird kein Wert angegeben, liefert exit den Status des letzten Kommandos.

export

  • Dient zum exportieren von Variablen und - mit der Option -f von Funktionen, sodass diese ab der (Shell)Prozess ihrer Definition auch in allen abgeleiteten Prozessen sichtbar sind ("globale Variablen").
  • Mit der Option -n kann die export-Eigenschaft entzogen werden.
  • -p listet alle exportierten Variablen und Symbole auf:
PATH=$PATH:/usr/local/bin
export PATH

fc

Siehe unter Manipulation der History-Einträge

fg

fg [Job]

Holt den angegebenen ("Jobnummer") bzw. den zuletzt gestarteten Hintergrundprozess in den Vordergrund.

getopts

siehe Linux:Shell:Bash:Builtin:getopts

hash

Ein auf der Kommandozeile angegebenes Kommando muss von der Shell gesucht werden.

Die Suche, vor allem wenn sie die Angaben aus PATH einschließt, kostet Zeit. Deswegen merkt sich die Bash die Zugriffspfade zu allen externen Kommandos in einer Hashtabelle.

Diese Hashtabelle wird zuerst konsultiert (es sei denn hashall ist nicht gesetzt; vergleiche set) und nur wenn der Pfad zu einem Kommando dort nicht erfasst wird, werden die Verzeichnispfade betrachtet.

Beim nächsten Zugriff auf dasselbe Kommando wird man den Geschwindigkeitszuwachs deutlich spüren.

Zur Anzeige der Hashtabelle ist »hash« ohne Angabe von Argumenten aufzurufen:

hash
hits    command
   2    /bin/ls
   1    /bin/mv
   6    /bin/sh
   8    /usr/bin/vi
   1    /bin/chmod
   3    /bin/date
   1    /usr/bin/id
   1    /usr/bin/man

Ein Problem besteht nun mit gleichnamigen Kommandos. Liegt eines in der Hashtabelle vor, so kann auf das andere nur über die vollständige Pfadangabe zugegriffen werden.

Soll dieses "benachteiligte" Kommando nun vermehrt eingesetzt werden, ist ein Löschen der Hashtabelle mittels »-r« sinnvoll:

hash -r
hash
hash: hash table empty

Indem »hash« mit einem oder mehreren Kommandonamen aufgerufen wird, werden diese Kommandos gesucht und in die Hashtabelle aufgenommen; sie werden jedoch nicht gestartet (sinnvoll ist dies eventuell in Startskripten).

Des Weiteren kann mit »-p <Pfad_zum_Kommando>« ein solches mit vorgegebenem Pfad der Tabelle hinzufügen.

help

Schreibt einen kurzen Hilfetext zu einem eingebauten Kommando aus.

history

  • Das Kommando dient zur Anzeige oder Manipulation des Kommandozeilenspeichers.
  • Ohne Optionen gerufen, werden alle Einträge der Liste inklusive einer Zeilennummerierung aufgeführt
  • mit einer vorangestellten Zahl kann die Darstellung auf die letzten Einträge eingeschränkt werden:
history 5
  555 parseline -aF -f
  556 parseline -f bla -l huch
  557 mv parseline Scripts\&Programs/
  558 ll Linuxfibel/bash.htm
  559 history 5
  • Anhand der Nummerierung kann nun gezielt ein Eintrag entfernt werden (»-d <Nummer>«). »-c« löscht den gesamten Inhalt.
  • Der Kommandozeilenspeicher wird bei Beendigung der Shell in einer Datei gesichert, um diese explizit zu aktualisieren, kann »-a« bzw. »-w« genutzt werden, womit die neuen Einträge angehangen werden bzw. der alte Inhalt ersetzt wird.

jobs

  • Das Kommando zeigt die in der Jobtabelle erfassten Jobs (Hintergrundprozesse) an.
  • Das Format der Ausgabe kann über Optionen gesteuert werden

kill

  • Das Kommando dient der Steuerung bereits laufender Prozesse, indem es an diese Signale versendet.
  • Während einige Signale vordefinierte Bedeutungen besitzen, können andere von den Prozessen nach eigenen Vorstellungen behandelt werden.
  • Das Versenden von Signalen soll auch im Zusammenhang mit Prozessen diskutiert werden.

let

  • Für jedes Argument wird eine arithmetische Substitution versucht.
  • Expandiert das letzte Argument zu 0, ist der Rückgabewert 1; sonst immer 0.
  • »let« bietet somit eine Möglichkeit der Überprüfung, ob eine Variable eine Zahl >0 enthält:
failure=1234x
let $failure 2>/dev/null || echo "keine Zahl"
keine Zahl
let answer=6*7
42

local

  • Das Kommando kann nur innerhalb von Funktionen verwendet werden und dient der Definition lokaler Variablen.
  • Somit ist sichergestellt, dass existierende Variablen gleichen Namens nichtversehentlich überschrieben werden:
var=foo
func() { var=bla; echo $var; }
func
bla
echo $var
bla
var=foo
func() { local var=bla; echo $var; }
func
bla
echo $var
foo

logout

  • Beendet eine Login-Bash und meldet den Benutzer ab.
  • In einer Nicht-Login-Bash hagelt es eine Fehlermeldung.

popd

  • Entfernt den obersten Eintrag vom Verzeichnisstack und wechselt zum neuen obersten Verzeichniseintrag. Dieser Wechsel kann mit der Option »-n« unterdrückt werden.
  • Um einen anderen Eintrag als den obersten zu entfernen, kann dieser mit »+Anzahl« angegeben werden.
  • Der oberste Verzeichniseintrag selbst ist »+0«, der zweite »+1« usw.
  • Mit »-Anzahl« beginnt die Zählung am unteren Ende des Stacks.
  • Ein Beispiel zur Anwendung folgt beim korrespondierenden »pushd«.

printf

siehe Linux:Shell:Bash:Builtin:printf

pushd

Mit dem Kommando kann in ein angegebenes Verzeichnis gewechselt werden, wobei das Verzeichnis auf einem Stack abgelegt wird.

Mit »-n« wird der Verzeichniswechsel verhindert, der Name des Verzeichnisses aber dennoch gespeichert. Dieser Stack kann rotiert werden, mit »-Anzahl« wird vom Ende des Stacks aus rotiert; mit »+Anzahl« vom Anfang.

Das nachfolgende Beispiel zählt alle Unterverzeichnisse ausgehend vom Startverzeichnis, wobei popd und pushd Verwendung finden:

cat countdir
#!/bin/sh

while :; do
  for i in $(ls); do
    test -d $i || continue
    pushd -n $(pwd)/$i &>/dev/null
    number=$(($number+1))
  done
  popd &>/dev/null && continue
  break
done
echo Anzahl: $number

pwd

  • Gibt das aktuelle Arbeitsverzeichnis aus.
  • Mit der der Option »-P« wird der Pfad ohne enthaltene symbolische Links angegeben; mit »-L« werden Links berücksichtigt.
  • Beide Optionen sind sinnvoll, um die Einstellung der Variablen »physical« zu überschreiben:
pwd
/usr/X11
pwd -P
/usr/X11R6
set -o physical
pwd
/usr/X11R6

read

siehe Linux:Shell:Bash:Builtin:read

readonly

  • Variablen und Funktionen lassen sich nachträglich als »nicht änderbar« deklarieren.
  • Um eine einfache Variable nur-lesend zu vereinbaren, genügt die Angabe ihres Namens; bezieht man sich auf eine Funktion, so ist »-f Funktionsname« anzugeben.
  • Eine Feldvariable bewahrt die Option »-a Feldvariable« vor versehentlichem Überschreiben.
  • Wird »readonly« ohne Angabe von Optionen oder Variablennamen aufgerufen, erhält man eine Auflistung aller »read-only«-Variablen und -Funktionen.

return

return [n]
  • Dient zum Rücksprung aus einer Funktion.
  • Mit [n] kann ein Rückgabewert vereinbart werden, ansonsten wird der Status des zuletzt innerhalb der Funktion ausgeführten Kommandos geliefert.

set

set dient zum Setzen bash-interner Variablen

shift

shift [n]
  • Dient zum Verschieben der Positionsparameter
  • ohne weitere Angaben wird die Liste der Positionsparameter um eine Stelle nach links verschoben
  • mit Angabe eine Ziffer wird um die spezifizierte Anzahl Stellen rotiert

shopt

Dient zum Setzen bash-interner Variablen, die das Verhalten der Shell maßgeblich beeinflussen

suspend

Suspendiert die Shell. Sie kann nur durch ein Signal SIGCONT reaktiviert werden.

test

  • test liefert in Abhängigkeit vom Wahrheitswert des Ausdrucks 0 (wahr) oder 1 (falsch) zurück und ist damit ein wichtiger Bestandteil vieler Shellskripten.
  • siehe Linux:Shell:Bash:Builtin:test

times

  • Misst die Zeit für die Shell und der von dieser gestarteten Kommandos.

Ausgegeben wird die User- und die Systemzeit (nicht jedoch die Realzeit, dies vermag das Kommando time):

times ls 0m0.090s 0m0.030s 0m0.160s 0m0.160s

trap

siehe Linux:Shell:Bash:Builtin:trap

type

siehe Linux:Shell:Bash:Builtin:type

typeset

Siehe declare

ulimit

siehe Linux:Shell:Bash:Builtin:ulimit

umask

unalias

Löscht den angegebenen Alias bzw. mit der Option -a alle Aliasse.

unset

Dient zum Löschen einer Variable oder Funktion.

wait

  • Dient zum Warten auf einen oder alle Hintergrundprozesse.
  • Wird keine Prozess- oder Jobnummer angegeben, so wird auf die Terminierung aller Hintergrundprozesse gewartet und der Rückgabewert ist 0.
  • Mit Spezifizierung einer Nummer wird genau auf den betreffenden Prozess gewartet und dessen Rückgabestatus ist der Rückgabewert von »wait«.

Links

Dateien

Man-Pages

Intern

Weblinks