Heute wollte ich die Man-Page von cd aufrufen. Was bekomme ich: “No manual entry for cd”.

Ich frage mich schon, warum das so ist. Den Befehl gibt es nämlich durchaus. Ich habe hier schon einige Male über die Kommandozeile geschrieben und beiläufig erwähnt, dass ich die Bash-Shell benutze. Das ist die vermutlich die populärste Linux-Shell, die in den meisten Linux-Distributionen vorinstalliert ist.

Im wesentlichen ist die Shell ein textbasiertes Interface, über das ich mit dem Computer interagieren kann. Bislang habe ich etwas unreflektiert angenommen, dass sich die Bash-Shell darauf beschränkt, meine Befehle entgegenzunehmen und die entsprechenden Programme auf meinem System aufzurufen. Weit gefehlt.

Es ist eine der Hauptaufgabe der Shell, Befehle, die ich eingegeben habe, durch Aufruf der entsprechenden Programme auszuführen. Gebe ich etwa ls ein, ruft die Bash-Shell das unter /bin/ls vorhandene Programm auf, das wiederum die Liste der Dateien und Verzeichnisse in meinem aktuellen Arbeitsverzeichnis ausgibt. Ich weiß, dass das ls-Programm gerade in /bin/ls liegt, weil der Befehl which ls mir das zurückgibt:

$ which ls
/bin/ls

Heute habe ich gelernt, dass es Programme gibt, die nicht irgendwo auf meinem System als ausführbare Datei liegen, aber trotzdem von der Bash ausgeführt werden können. Das sind sogenannte “Builtins”, auf Deutsch so was wie die “Eingebauten”. Das sind Befehle, die unmittelbar im Code der Bash-Shell vorhanden sind, so dass sie keine externen Programme bemühen muss. Das hat historische Gründe, geht schneller und ist manchmal erforderlich. So bei cd, der das Arbeitsverzeichnis der Shell wechselt und damit innerhalb der Shell ausgeführt werden muss.

Ich kann rauskriegen, ob ein Befehl ein in der Shell eingebauter Befehl ist, indem ich tippe:

type <Befehl>

Für cd sieht das so aus1:

$ type cd
cd is a shell builtin

type ist, wie cd, ein in der Shell eingebauter Befehl. Genauso zum Beispiel echo. Das erklärt, warum diese Befehle keine eigene Man-Page haben. Stattdessen müsste ich man bash eingeben und mich durch viele Seiten Text scrollen.

Einige Befehle gibt es doppelt:

$ type echo
echo is a shell builtin
$ which echo
/bin/echo

Das ist ein Widerspruch: Wenn echo unmittelbarer Bestandteil der Shell ist, so wie type das ausgibt, sollte which an sich kein Programm finden. Tut es aber. Die Man-Page von echo löst dieses Rätsel:

NOTE: your shell may have its own version of echo, which usually supersedes the version described here. Please refer to your shell’s documentation for details about the options it supports.

Die in die Shell eingebaute Variante von echo, für die es keine Man-Page gibt, hat also Vorrang vor dem separaten Programm echo, für das es eine Man-Page gibt.

Das letzte Rätsel für heute ist, wie ich denn nun an die Man-Page von cd komme, ohne mich durch viele Seiten Man-Page-Text von man bash zu scrollen. Die Lösung in diesem Fall heißt help und ist ebenfalls ein in die Shell eingebauter Befehl:

$ type help
help is a shell builtin
$ help help
help: help [-dms] [pattern ...]
    Display information about builtin commands.

Also: Statt man cd benutze ich help cd, und alles ist so, wie ich möchte.

  1. In Wirklichkeit gibt mir type cd etwas Anderes aus, weil ich den cd-Befehl vor kurzem umgeleitet habe.