Befehlsersetzung

Aus Mikiwiki
Wechseln zu: Navigation, Suche

Befehlsersetzung (auch: Befehlssubsitution)

Quoting

Umgekehrter Schrägstrich ( \ )

In manchen Fällen wird ein Zeichen mit vorangestelltem umgekehrtem Schrägstrich zu einem besonderen Zeichen (Escape-Sequenz), etwa bei Verwendung des Befehls echo oder bei Prompt-Zeichenketten.

Escape-
Sequenz
Beschreibung
\n ("newline") Zeilenumbruch
\u ("username") Benutzername
\w ("current working directory") aktuelles Verzeichnis
\\ umgekehrter Schrägstrich

In anderen Fällen verliert ein besonderes Zeichen durch den vorangestellten umgekehrten Schrägstrich seine Besonderheit. Viele Satzzeichen haben für die Shell eine besondere Bedeutung, z. B. die einfachen, die doppelten und die rückwärtsgerichteten Anführungszeichen, das Frage- und das Ausrufezeichen, das Dächlein, das Handels-und, der senkrechte Strich, der Stern, die runden, eckigen, spitzen und geschweiften Klammern, die Tilde und der Strichpunkt. Jedes dieser Zeichen kann auch literal behandelt werden. Es folgen einige Beispiele.

Befehl Beschreibung
rm * Löscht ohne Nachfrage alle Dateien (ausser die mit mit ein em Punkt beginnenden) im aktuellen Verzeichnis.
rm \* Löscht die Datei mit dem Namen "*".
cat \! Zeigt den Inhalt der Datei "!" an.

Weil der umgekehrte Schrägstrich der Shell meistens mitteilt, dass sie das nachfolgende Zeichen literal behandeln soll, kann er auch dazu benutzt werden, der Shell mitzuteilen, dass die nächste Zeile Teil des selben Befehls ist.

$ echo one\
> two \
> three
onetwo three

Die Shell ignoriert mehrere aufeinanderfolgende Leerzeichen und komprimiert sie automatisch zu einem einzelnen Leerzeichen.

$ echo one       two
one two

Einfache Anführungszeichen ( ' )

Einfache Anführungszeichen können verwendet werden, um find-, grep-, sed- und awk-Befehle davor zu schützen, von der Shell interpretiert zu werden.

Die einfachen Anführungszeichen verhindern, dass der Stern von der Shell interpretiert wird. Es werden also alle Dateien gefunden, deren Name aus inem Stern besteht.

$ find / -name '*' -print >& ~/allfiles.txt

Der Stern wird von der Shell interpretiert. Es werden also alle Dateien im aktuellen Verzeichnis gefunden.

$ find . -name * -print >& ~/allfiles.txt

Alle Zeichen zwischen einfachen Anführungszeichen (ausser den einfachen Anführungszeichen selbst) werden nicht interpretiert.

$ echo one          two
one two
$ echo 'one          two'
one          two
$ echo 'three
>
> four
> five `@#$%^\"[]'
three

four
five `@#$%^\"[]'

Rückwärtsgerichtete Anführungszeichen ( ` )

Von linksgerichteten Hochkommas ( ` ) umschlossene Werte werden ausgeführt und die Shell ersetzt den geklammerten Ausdruck durch das Ergebnis, das der Programmaufruf liefert.

Löschen aller Dateien mit der Endung ".tmp" im aktuellen Verzeichnis.

$ rm `find -name "*.tmp" -print`
oder besser:
$ find -name "*.tmp" -print
$ rm `!!`</tt>

...

$ echo Dieses Verzeichnis enthält `ls | wc -l` Dateien.
Dieses Verzeichnis enthält 14 Dateien.

...

$ echo Dieses Verzeichnis enthält `ls \`pwd\` | wc -l` Dateien.
Dieses Verzeichnis enthält 14 Dateien.

oder (unter der Korn-Shell und in der Bash)

$ echo Dieses Verzeichnis enthält `ls $(pwd) | wc -l` Dateien.
Dieses Verzeichnis enthält 14 Dateien.

Interpretation geklammerter Metazeichen

Erklärung zu den Metazeichen: "T" steht für den Terminator, "J" für interpretierte Zeichen, "N" für Zeichen, die nicht interpretiert werden.

Klammer Metazeichen Beschreibung
' " ` \ $ *
'...' T N N N N N Von einfachen (rechtsgerichteten) Hochkommas (') umschlossene Variablen werden nicht expandiert.
$ echo 'Hallo $k heute am `date` arbeiten $(who | wc -l) Benutzer'
Hallo $k heute am `date` arbeiten $(who | wc -l) Benutzer

Mit dem folgenden Befehl erhält der Shell-Prompt die Zeichenkette '${PWD} % ' , die während der Anzeige des Shell-Prompts stets den aktuellen Wert der Variablen "PWD" liefert. Wird das Verzeichnis gewechselt, ändert sich also auch der angezeigte Shell-Prompt.

$ dummy@linux:~> PS1='${PWD} % '
/home/dummy %
"..." N T J J J N Von doppelten Hochkommas (") umschlossene Variablen werden expandiert, also durch ihren Wert ersetzt.
$ echo "Hallo $k heute am `date` arbeiten $(who | wc -l) Benutzer"
Hallo  heute am Mit Apr  2 22:27:57 CEST 2003 arbeiten 2 Benutzer

Die Zeichenkette "${PWD} $ " wird durch die Shell expandiert und zeigt fortan die Zeichenkette an, die die Variable "PWD" zum Zeitpunkt der Zuweisung an "PS1" enthielt.

$ PS1="${PWD} $ "
`...`
oder
$(...)
N N T J N N Von linksgerichteten Hochkommas ( ` ) umschlossene Werte werden ausgeführt und die Shell ersetzt den geklammerten Ausdruck durch das Ergebnis, das der Programmaufruf liefert.

Der Wert der Variable "HOSTNAME" wird durch das Ergebnis des Befehls "/bin/hostname" ersetzt.

$ HOSTNAME=`/bin/hostname`

Eine neuere Schreibweise mit demselben Ergebnis ist die folgende.

$ HOSTNAME=$(/bin/hostname)

Weblinks