Bash

Aus ConeleK-Wiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Allgemein

Inhalt

Dateinamen zerlegen

Inhalt

Das folgende Listing zeigt, wie man einzelne Teile eines Dateinamens erhält (nur Endung, nur Stammname, nur Verzeichnis, gesamter Dateiname):

$ filename=/tmp/testfile.tar.gz
$ echo ${filename##*.}# matches extension non-greedily
gz
$ echo ${filename#*.}         # matches extension greedily
tar.gz
$ echo ${filename%.*}         # matches all but extension greedily
/tmp/testfile.tar
$ echo ${filename%%.*}        # matches all but extension non-greedily
/tmp/testfile
$ echo $(basename $filename)  # filename including extension but without directory
testfile.tar.gz
$ echo $(dirname $filename)   # directory of file
/tmp

Farbe des Prompt-Titels verändern

Inhalt

Der Anfang jeder Zeile in einer Standard-Bash-Sitzung kann mithilfe der Umgebungsvariablen PS1 verändert werden (zu weiteren PS-Umgebungsvariablen siehe [1]).

Beispiel für root

Ein Beispiel ist der folgende Code aus der Datei /root/.bashrc:

PS1='\[\033[31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$'

Der Benutzername und Host werden in Rot geschrieben, der aktuelle Dateipfad in hellem Blau.

Beispiel für normalen Benutzer

Ein zweites Beispiel ist der folgende Code aus der Datei ~/.bashrc:

PS1='\[\033[01;37m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$'

Der Benutzername und Host werden in Weiß geschrieben, der aktuelle Dateipfad in hellem Blau.

Erklärung im Einzelnen

FarbeFarbcode
keine Farbe (default)0;00
Rot0;21
helles Blau0;34
Weiß1;37

Globbing

Inhalt

Die Bash bietet eine Vielzahl an komfortablen Fähigkeiten, dazu gehört es, alle Dateien im aktuellen Verzeichnis auszugeben (Globbing - siehe [4]), die einem bestimmten Muster entsprechen:

$ echo *.txt
tmp.txt

Dadurch kann man leicht bspw. über alle Textdateien im Verzeichnis iterieren:

$ for file in *.txt; do file $file; done
tmp.txt: UTF-8 Unicode text

Ein Problem tritt auf, wenn es keine solchen Dateien gibt. Statt einer zu erwartenden leeren Ausgabe erhält man eine Fehlermeldung, da man im Falle, dass keine passenden Dateien gefunden werden, einfach den Originalausdruck zurückbekommt:

$ for file in *.nicht_vorhandene_endung; do file $file; done
*.nicht_vorhandene_endung: ERROR: cannot open `*.nicht_vorhandene_endung' (No such file or directory)

Dieses Problem kann man umgehen, indem man sogenannte Nullglobs aktiviert:

$ shopt -s nullglob
$ for file in *.nicht_vorhandene_endung; do file $file; done
$

Wie man sieht, sieht man nichts und das ist genau das, was man oft haben möchte. Das ursprüngliche Verhalten lässt sich über

shopt -u nullglob

wiederherstellen.

Normalerweise werden versteckte Dateien (beginnen mit einem Punkt) nicht beim Globbing erkannt. Dies kann man mittels

shopt -s dotglob # Versteckte Dateien miteinbeziehen
shopt -u dotglob # Versteckte Dateien nicht miteinbeziehen

konfigurieren.

Dateisystem

Inhalt

Dateiinformationen

Ordnerstruktur

Speicherplatzinformationen

Wer greift auf eine Datei zu?

Oft weigert sich umount, ein Laufwerk auszuhängen, da das Gerät noch genutzt würde: device is busy. Man kann herausfinden, wer ein bestimmtes Laufwerk (hier gemountet als /mnt/sdb1) nutzt:

sudo fuser -m -u /mnt/sdb1

Einen ähnlichen Befehl gibt es für Dateien:

$ sudo lsof /var/log/auth.log
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
rsyslogd 1182 syslog    2w   REG    8,3    50569 2098332 /var/log/auth.log

Datei sicher löschen

Überschreibe tmp.txt insgesamt 10 Mal, dann mit Nullen (-z: zeros) und lösche die Datei danach (-u: unlink):

shred -n 10 -z -u tmp.txt

Zeichensatz und Zeilenenden

Inhalt einer UTF-8-Datei in Latin-9 konvertieren (Mit TAB kann man sich die verfügbaren über 1000(!) Zeichensätze anzeigen lassen):

$ file tmp.txt 
tmp.txt: UTF-8 Unicode text
$ iconv -f UTF-8 -t ISO8859-9
ISO8859-9   ISO8859-9E  
$ iconv -f UTF-8 -t ISO8859-9 tmp.txt > tmp.txt.latin9 
$ file tmp.txt.latin9 
tmp.txt.latin9: ISO-8859 text

Zeilenenden von Unix auf Windows ändern (und zurück - der Schalter -b ist nötig, falls Umlaute in der Datei auftreten, UTF-8 in diesem Fall):

$ file tmp.txt
tmp.txt: UTF-8 Unicode text
$ flip -mb tmp.txt
$ file tmp.txt
tmp.txt: UTF-8 Unicode text, with CRLF line terminators
$ flip -ub tmp.txt
$ file tmp.txt
tmp.txt: UTF-8 Unicode text

Geräteinformationen anzeigen

Inhalt

Musik, Bilder und Videos

Inhalt

Zusammenfassung über die Eigenschaften einer mp3-Datei:

$ mp3info -x Fairytales\ -\ Alexander\ Rybak.mp3 
File: Fairytales - Alexander Rybak.mp3
Title:   Fairytale                      Track: 2
Artist:  Alexander Rybak
Album:   Fairytales                     Year:  2009
Comment:                                Genre: Pop [13]
Media Type:  MPEG 1.0 Layer III
Audio:       Variable kbps, 44 kHz (joint stereo)
Emphasis:    none
CRC:         No
Copyright:   No
Original:    Yes
Padding:     No
Length:      3:07

Installation via

sudo apt-get install mp3info

Paketmanagement

Inhalt

dpkg

Das Tool dpkg macht sich unter anderem in den folgenden Situationen nützlich:

apt

Archive hinzufügen und entfernen

(am Beispiel des Person Package Archivs ppa:stesind/ppa)

Hinzufügen:

$ sudo apt-add-repository ppa:stesind/ppa 
You are about to add the following PPA to your system:
 stesind-ppa
[...]
Dependencies (automatically or pre-installed):
 
python2.6
pygtk
 More info: https://launchpad.net/~stesind/+archive/ppa
Press [ENTER] to continue or ctrl-c to cancel adding it
 
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /tmp/tmp.vhZ0pjQFOq --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://keyserver.ubuntu.com:80/ --recv BC3AAA57423DFEF471DC5589F8ECECC33CB35D04
gpg: requesting key 3CB35D04 from hkp server keyserver.ubuntu.com
gpg: key 3CB35D04: "Launchpad stesind-alsa" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1

Danach ist ein Update nötig:

sudo apt-get update

Entfernen:

sudo apt-add-repository --remove ppa:stesind/ppa

Man kann auch Repositories im apt-Format angeben (wie in der Datei /etc/apt/sources.list):

sudo apt-add-repository 'deb http://myserver/path/to/repo stable myrepo'

Services und Hintergrundprozesse

Inhalt

Die folgenden Ausführungen gelten vornehmlich für Ubuntu und verwandte Systeme.

Runlevel

Die einzelnen Runlevel haben folgende Bedeutung (nach [5])

Runlevel 0

System wird heruntergefahren

Runlevel 1

System im Einzelbenutzerbetrieb

Runlevel 2

System im Mehrbenutzerbetrieb

Runlevel 3 bis 5

nicht genutzt

Runlevel 6

Systemneustart

Automatische Startprozesse konfigurieren

Als Beispiel wird hier der Tomcat-Webserver (tomcat6) verwendet. Bei den meisten der verwendeten Befehlen funktioniert die Vervollständigung mittels TAB.

Default-Werte ermitteln

Bevor man einen Prozess aus der Startreihenfolge entfernt, sollte man sich ansehen, wo er während der Installation eingetragen wurde, damit man dies wiederherstellen kann, wenn man den Prozess erneut automatisch starten lassen möchte. Dazu kann man beim Austragen des Services den Schalter -n (nur simulieren) nutzen. Falls der Dienst noch läuft (sudo service tomcat6 status), muss man das Austragen mittels -f erzwingen:

sudo update-rc.d -n -f tomcat6 remove
 Removing any system startup links for /etc/init.d/tomcat6 ...
   /etc/rc0.d/K08tomcat6
   /etc/rc1.d/K08tomcat6
   /etc/rc2.d/S92tomcat6
   /etc/rc3.d/S92tomcat6                                                                                                                                         
   /etc/rc4.d/S92tomcat6                                                                                                                                         
   /etc/rc5.d/S92tomcat6                                                                                                                                         
   /etc/rc6.d/K08tomcat6

rc0.d/K08tomcat6

heißt dabei, dass tomcat6 im Runlevel 0 (rc0) an 08. Stelle unter den zu stoppenden Prozessen (K: kill) steht

rc2.d/S92tomcat6

heißt analog, dass tomcat6 im Runlevel 2 (rc2) an 92. Stelle unter den zu startenden Prozessen (S: start) steht

Für einen sicheren Startablauf ist dabei die Konvention üblich, dass die Prozesse in ihrer umgekehrten Startreihenfolge gestoppt werden, dabei werden die Skripte mit kleinerer Nummer zuerst und die mit größerer Nummer später ausgeführt, wobei Nummern im Bereich von 00 bis 99 vorgesehen sind.

Für tomcat6 erhält man somit für eine Startnummer von 92 eine Stoppnummer von 100 - 92 = 8.

Prozess austragen

Ist man sich nun sicher, dass man den Prozess austragen möchte, dann kann man diesen mittels

sudo update-rc.d -f tomcat6 remove

entfernen.

Prozess eintragen

Um nun den Prozess mit den exakten vorherigen Einstellungen einzutragen, muss man jeweils genau spezifizieren, wo der Prozess in welchem Runlevel platziert werden soll:

sudo update-rc.d -f tomcat6 start 92 2 3 4 5 . stop 08 0 1 6 .

start 92 2 3 4 5 .

Starte tomcat6 in den Runlevels 2 3 4 5 an Stelle 92

stop 08 0 1 6 .

Stoppe tomcat6 in den Runlevels 0 1 6 an Stelle 08

Anmerkung: Der Punkt am Ende ist für eine korrekte Konfiguration wichtig!

Links

Zufallsstring

Inhalt

Einen zufälligen String kann man manuell wie folgt erzeugen:

cat /dev/urandom|tr -dc "a-zA-Z0-9-_\$\?"|fold -w 16|head -n 3 | sort

Die Ausgabe sieht dann etwa so aus:

48rk4SRPX?OE20Gt
4BzNt_1Qbm8bQT-I
7cbwdv$XUSKt6ked

Es werden dabei 3 Strings mit jeweils 16 Zeichen erzeugt, die ausschließlich aus Klein- und Großbuchstaben, Ziffern, Binde-/Unterstrichen sowie "$" und "?" bestehen.

Persönliche Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
CEK Module
Kategorien
Wiki-Info
Werkzeuge