Tipps und Tricks zur bash: Unterschied zwischen den Versionen

Aus dem IServ-Wiki
Zur Navigation springen Zur Suche springen
K (hatte ich erwähnt, dass ich blind bin? :])
 
(7 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 11: Zeile 11:
 
=== Mehrere Dateinamen ===
 
=== Mehrere Dateinamen ===
 
Im Gegensatz zu DOS können an praktisch alle Linux-Tools beliebig viele Dateinamen per Parameter übergeben werden. Statt
 
Im Gegensatz zu DOS können an praktisch alle Linux-Tools beliebig viele Dateinamen per Parameter übergeben werden. Statt
<pre>
+
<cmdpre>
$ rm Datei1
+
rm Datei1
$ rm Datei2
+
rm Datei2
$ rm Datei3
+
rm Datei3
</pre>
+
</cmdpre>
 
kann auch einfach
 
kann auch einfach
<pre>
+
<cmdpre>
$ rm Datei1 Datei2 Datei3
+
rm Datei1 Datei2 Datei3
</pre>
+
</cmdpre>
 
ausgeführt werden.
 
ausgeführt werden.
  
 
=== Platzhalter / Wildcards ===
 
=== Platzhalter / Wildcards ===
 
Ähnlich wie bei DOS können Platzhalter in Dateinamen verwendet werden:
 
Ähnlich wie bei DOS können Platzhalter in Dateinamen verwendet werden:
* <tt>*</tt>: für beliebig viele beliebige Zeichen
+
* <tt>*</tt>: für beliebig viele beliebige Zeichen (außer "/")
 
* <tt>?</tt>: für ein beliebiges Zeichen
 
* <tt>?</tt>: für ein beliebiges Zeichen
* <tt>Datei[1-3]</tt>: für "<tt>Datei1 Datei2 Datei3</tt>"
+
* <tt>~</tt>: für das Home-Verzeichnis des gerade angemeldeten Benutzers
* <tt>Datei[13]</tt>: für "<tt>Datei1 Datei3</tt>"
+
* <tt>~abc</tt>: für das Home-Verzeichnis des Benutzers <tt>abc</tt>
* <tt>Datei{1,3}</tt>: für "<tt>Datei1 Datei3</tt>"
+
* <tt>[abc]</tt>: für eine Auswahl von Zeichen (hier: a, b und c)
 +
* <tt>[a-c]</tt>: für eine Reihe von Zeichen (hier: a, b und c)
 +
* <tt>{aaa,bbb}</tt>: für eine Auswahl von Worten (hier: aaa und bbb)
 +
* <tt>$ABC</tt>: für eine Umgebungsvariable
 +
* <tt>$(abc)</tt>: für die Ausgabe eines Befehls
 +
* <tt>`abc`</tt>: ebenso (nicht empfohlen, da schlecht lesbar)
  
 
+
Ein wichtiger Unterschied hierbei ist jedoch, dass die Platzhalter ''nicht'' von dem Programm, sondern von der Shell ausgewertet werden. Wenn ein Verzeichnis beispielsweise die Dateien <tt>Datei1</tt>, <tt>Datei2</tt> und <tt>Datei3</tt> enthält, und der Befehl <cmdpre>rm Datei?</cmdpre> ausgeführt wird, dann macht die Shell intern <cmdpre>rm Datei1 Datei2 Datei3</cmdpre> daraus <tt>rm</tt> erfährt also gar nicht, dass der Benutzer <tt>Datei?</tt> eingegeben hat.
Ein wichtiger Unterschied hierbei ist jedoch, dass die Platzhalter '''nicht''' von dem Programm, sondern von der Shell ausgewertet werden. Wenn ein Verzeichnis beispielsweise die Dateien <tt>Datei1</tt>, <tt>Datei2</tt> und <tt>Datei3</tt> enthält, und der Befehl
 
<pre>
 
rm Datei?
 
</pre>
 
ausgeführt wird, dann macht die Shell intern
 
<pre>
 
rm Datei1 Datei2 Datei3
 
</pre>
 
daraus - <tt>rm</tt> erfährt also gar nicht, dass der Benutzer <tt>Datei?</tt> eingegeben hat.
 
  
 
=== Mehrere Dateien umbenennen ===
 
=== Mehrere Dateien umbenennen ===
Aus diesem Grund funktioniert die aus DOS gewohnte Syntax
+
Aus diesem Grund funktioniert die aus DOS gewohnte Syntax <cmdpre>ren *.alt *.neu</cmdpre> unter Linux nicht - die <tt>bash</tt> würde aus <cmdpre>mv Datei* File*</cmdpre> <cmdpre>mv Datei1 Datei2 Datei3 File*</cmdpre> machen. Glücklicherweise erkennt <tt>mv</tt> den Lapsus und verweigert die Operation.
<pre>
 
ren *.alt *.neu
 
</pre>
 
unter Linux nicht - die <tt>bash</tt> würde aus
 
<pre>
 
mv Datei* File*
 
</pre>
 
<pre>
 
mv Datei1 Datei2 Datei3 File*
 
</pre>
 
machen. Glücklicherweise erkennt <tt>mv</tt> den Lapsus und verweigert die Operation.
 
  
Stattdessen bedient man sich dazu einer <tt>for</tt>-Schleife:
+
Stattdessen bedient man sich dazu einer <tt>for</tt>-Schleife: <cmdpre>for i in Datei*; do mv $i File${i/Datei}; done</cmdpre> Das <tt>${i/Datei}</tt> schneidet hierbei den Teil <tt>Datei</tt> aus dem Namen weg und gibt nur den Rest, also die Zahl, zurück.
<pre>
 
for i in Datei*; do mv $i File${i/Datei}; done
 
</pre>
 
Das <tt>${i/Datei}</tt> schneidet hierbei den Teil <tt>Datei</tt> aus dem Namen weg und gibt nur den Rest, also die Zahl, zurück.
 
  
 
== Aliase ==
 
== Aliase ==
 
=== Neue Namen ===
 
=== Neue Namen ===
Mit Aliasen kann man bequem neue Befehle definieren, die letztendlich einen anderen Befehl ausführen, falls gewünscht, auch mit vorgegeben Parametern. Beispielsweise kann man mit
+
Mit Aliasen kann man bequem neue Befehle definieren, die letztendlich einen anderen Befehl ausführen, falls gewünscht, auch mit vorgegeben Parametern. Beispielsweise kann man mit <cmdpre>alias dateiliste=ls</cmdpre> einen neuen Namen für das Tool <tt>ls</tt> schaffen; ab dann kann man statt <tt>ls</tt> auch <tt>dateiliste</tt> in der Konsole eingeben.
<pre>
+
 
alias dateiliste=ls
 
</pre>
 
einen neuen Namen für das Tool <tt>ls</tt> schaffen; ab dann kann man statt <tt>ls</tt> auch <tt>dateiliste</tt> in der Konsole eingeben.
 
 
=== Vorgegebene Parameter ===
 
=== Vorgegebene Parameter ===
Viel sinnvoller als das Erschaffen von neuen Namen für vorhandene Tools ist jedoch die Vorgabe von Parametern:
+
Viel sinnvoller als das Erschaffen von neuen Namen für vorhandene Tools ist jedoch die Vorgabe von Parametern: <cmdpre>alias ls="ls -l --color=auto -F -h -X"</cmdpre> In diesem Beispiel wird <tt>ls</tt> immer gleich eine Reihe von Parametern<ref><tt>-l</tt>: Listenansicht, <tt>--color=auto</tt>: farbige Ausgabe, <tt>-f</tt>: Klassifizierung von Dateien (siehe Manpage), <tt>-h</tt>: human-readable (Größen in MB etc.), <tt>-X</tt>: Sortierung nach Erweiterung</ref> mit übergeben, die nun nicht mehr per Hand eingegeben werden müssen. Parameter, die nun per Hand eingegeben werden, werden natürlich zusätzlich zu den vorgegebenen Parametern an <tt>ls</tt> übergeben.
<pre>
+
 
alias ls="ls -l --color=auto -F -h -X"
 
</pre>
 
In diesem Beispiel wird <tt>ls</tt> immer gleich eine Reihe von Parametern<ref><tt>-l</tt>: Listenansicht, <tt>--color=auto</tt>: farbige Ausgabe, <tt>-f</tt>: Klassifizierung von Dateien (siehe Manpage), <tt>-h</tt>: human-readable (Größen in MB etc.), <tt>-X</tt>: Sortierung nach Erweiterung</ref> mit übergeben, die nun nicht mehr per Hand eingegeben werden müssen. Parameter, die nun per Hand eingegeben werden, werden natürlich zusätzlich zu den vorgegebenen Parametern an <tt>ls</tt> übergeben.
 
 
=== Aliase umgehen ===
 
=== Aliase umgehen ===
Benötigt man plötzlich mal <tt>ls</tt> ohne jegliche Parameter, kann man das Auflösen des Alias mithilfe von Anführungszeichen (<tt>'</tt> oder <tt>"</tt>) umgehen:
+
Benötigt man plötzlich mal <tt>ls</tt> ohne jegliche Parameter, kann man das Auflösen des Alias mithilfe von Anführungszeichen (<tt>'</tt> oder <tt>"</tt>) umgehen: <cmdpre>'ls'</cmdpre>
<pre>
+
 
'ls'
 
</pre>
 
 
=== Aliase fest speichern ===
 
=== Aliase fest speichern ===
 
Aliase gelten immer nur für die aktuelle Sitzung. Um sie dauerhaft zu speichern, müssen sie entweder in die <tt>.bashrc</tt> des aktuellen Benutzers eingetragen werden, oder, für systemweite Wirkung, in die Datei <tt>/etc/bashrc</tt>.
 
Aliase gelten immer nur für die aktuelle Sitzung. Um sie dauerhaft zu speichern, müssen sie entweder in die <tt>.bashrc</tt> des aktuellen Benutzers eingetragen werden, oder, für systemweite Wirkung, in die Datei <tt>/etc/bashrc</tt>.
Zeile 84: Zeile 57:
 
{{Fußnoten}}
 
{{Fußnoten}}
  
[[Kategorie:Tipps und Tricks]]
+
[[Kategorie:Anleitungen für Admins/Linux]]

Aktuelle Version vom 20. April 2009, 17:17 Uhr

Die bash ist die Standard-Icon Wikipedia De.gifShell unter Linux.

Konfiguration

Globale Konfiguration
/etc/bashrc
Benutzerspezifische Konfiguration
~/.bashrc (wird für Nicht-Loginshells ausgeführt)
~/.bash_profile (wird für Loginshells ausgeführt, führt normalerweise die .bashrc ebenfalls aus)

Übergeben von Dateinamen

Mehrere Dateinamen

Im Gegensatz zu DOS können an praktisch alle Linux-Tools beliebig viele Dateinamen per Parameter übergeben werden. Statt

befehl
rm Datei1
rm Datei2
rm Datei3

kann auch einfach

befehl
rm Datei1 Datei2 Datei3

ausgeführt werden.

Platzhalter / Wildcards

Ähnlich wie bei DOS können Platzhalter in Dateinamen verwendet werden:

  • *: für beliebig viele beliebige Zeichen (außer "/")
  • ?: für ein beliebiges Zeichen
  • ~: für das Home-Verzeichnis des gerade angemeldeten Benutzers
  • ~abc: für das Home-Verzeichnis des Benutzers abc
  • [abc]: für eine Auswahl von Zeichen (hier: a, b und c)
  • [a-c]: für eine Reihe von Zeichen (hier: a, b und c)
  • {aaa,bbb}: für eine Auswahl von Worten (hier: aaa und bbb)
  • $ABC: für eine Umgebungsvariable
  • $(abc): für die Ausgabe eines Befehls
  • `abc`: ebenso (nicht empfohlen, da schlecht lesbar)

Ein wichtiger Unterschied hierbei ist jedoch, dass die Platzhalter nicht von dem Programm, sondern von der Shell ausgewertet werden. Wenn ein Verzeichnis beispielsweise die Dateien Datei1, Datei2 und Datei3 enthält, und der Befehl

befehl
rm Datei?

ausgeführt wird, dann macht die Shell intern

befehl
rm Datei1 Datei2 Datei3

daraus – rm erfährt also gar nicht, dass der Benutzer Datei? eingegeben hat.

Mehrere Dateien umbenennen

Aus diesem Grund funktioniert die aus DOS gewohnte Syntax

befehl
ren *.alt *.neu

unter Linux nicht - die bash würde aus

befehl
mv Datei* File*
befehl
mv Datei1 Datei2 Datei3 File*

machen. Glücklicherweise erkennt mv den Lapsus und verweigert die Operation. Stattdessen bedient man sich dazu einer for-Schleife:

befehl
for i in Datei*; do mv $i File${i/Datei}; done

Das ${i/Datei} schneidet hierbei den Teil Datei aus dem Namen weg und gibt nur den Rest, also die Zahl, zurück.

Aliase

Neue Namen

Mit Aliasen kann man bequem neue Befehle definieren, die letztendlich einen anderen Befehl ausführen, falls gewünscht, auch mit vorgegeben Parametern. Beispielsweise kann man mit

befehl
alias dateiliste=ls

einen neuen Namen für das Tool ls schaffen; ab dann kann man statt ls auch dateiliste in der Konsole eingeben.

Vorgegebene Parameter

Viel sinnvoller als das Erschaffen von neuen Namen für vorhandene Tools ist jedoch die Vorgabe von Parametern:

befehl
alias ls="ls -l --color=auto -F -h -X"

In diesem Beispiel wird ls immer gleich eine Reihe von Parametern[1] mit übergeben, die nun nicht mehr per Hand eingegeben werden müssen. Parameter, die nun per Hand eingegeben werden, werden natürlich zusätzlich zu den vorgegebenen Parametern an ls übergeben.

Aliase umgehen

Benötigt man plötzlich mal ls ohne jegliche Parameter, kann man das Auflösen des Alias mithilfe von Anführungszeichen (' oder ") umgehen:

befehl
'ls'

Aliase fest speichern

Aliase gelten immer nur für die aktuelle Sitzung. Um sie dauerhaft zu speichern, müssen sie entweder in die .bashrc des aktuellen Benutzers eingetragen werden, oder, für systemweite Wirkung, in die Datei /etc/bashrc.



  1. -l: Listenansicht, --color=auto: farbige Ausgabe, -f: Klassifizierung von Dateien (siehe Manpage), -h: human-readable (Größen in MB etc.), -X: Sortierung nach Erweiterung