Dedies-Board (https://www.dedies-board.de/wbb2/index.php)
- Linux (https://www.dedies-board.de/wbb2/board.php?boardid=30)
-- FAQs (https://www.dedies-board.de/wbb2/board.php?boardid=32)
--- Kleine Tipps für die bash (https://www.dedies-board.de/wbb2/thread.php?threadid=2350)
Geschrieben von Haui am 25.08.2008 um 20:19:
Kleine Tipps für die bash
Ich nutze hier mal die Gelegenheit um ein paar nützliche Tipps & Tricks für die bash vorzustellen. Erweiterungen von anderen Usern sind selbstverständlich willkommen.
- Zunächst stellen wir sicher, dass die Datei /etc/inputrc die folgenden Zeilen enthält:
code: |
1:
2:
|
"\e[5~": history-search-backward
"\e[6~": history-search-forward |
|
Ist das geschehen, so können wir nach einem erneuten Einloggen früher eingegebene Befehle sehr leicht vervollständigen - so blättert beispielsweise ein f<Bild-Auf> durch alle Befehle in der History, die mit f anfangen.
- Folgendes fügen wir an geeigneter Stelle in die ~/.bashrc ein:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
up() {
if [ $# == 0 ]
then
cd ..
return
fi
if [ "${1//[^0-9]/}" != "$1" ]
then
echo "Not a number"
return
fi
STRING=""
for (( i=0; i<$1 ; i++ ))
do
STRING="$STRING../"
done
cd $STRING
} |
|
Danach genügt ein source ~/.bashrc oder das Öffnen einer neuen shell um die Funktion nutzen zu können. up verhält sich genauso wie cd .., d.h es wechselt ins Elternverzeichnis des aktuellen Verzeichnisses. up N springt N Verzeichnisse nach oben, wobei N eine ganzzahlige Zahl sein muss.
- unbekannter als die prominente for i in... Schleife dürfte die unter gewissen Umständen auch recht nützliche C-Version der for-Schleife sein: for ((i=0; i<foo; i++)); do bar; done
Wichtig sind hierbei die doppelten Klammern!
- Dateien suchen leicht gemacht - die erste Funktion sucht case sensitive, die zweite case insensitive nach Dateinamen, die das übergebene Suchmuster enthalten. Dazu müssen beide Funktionen in die ~/.bashrc geschrieben werden.
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
|
ffs(){
if [ $# -gt 0 ]
then
find -name "*$1*"
else
echo "argument required"
fi
}
ffi(){
if [ $# -gt 0 ]
then
find -iname "*$1*"
else
echo "argument required"
fi
} |
|
Verwendung: ffs Suchwort bzw ffi Suchwort
- Das hier spart ein wenig Schreibarbeit, wenn man auf der Suche nach einem bestimmten Prozess ist. Auch hierbei handelt es sich um eine Funktion für die ~/.bashrc.
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
|
pf(){
if [ $# -gt 0 ]
then
ps aux | grep TTY | grep -v "grep TTY"
ps aux | grep -i "$1" | grep -v "grep -i $1"
else
echo "argument required"
fi
} |
|
Verwendung: pf Prozess - Groß- u. Kleinschreibung des Prozesses spielen keine Rolle.
- Eine kleine Erweiterung für den bash-Promt, auf die ich nicht mehr verzichten will - die Anzeige der aktuellen Uhrzeit. Um das zu bewerkstelligen muss man nur die Variable PS1entsprechend anpassen.
Dazu sehen wir und zunächst den aktuellen Prompt an:
code: |
1:
|
user@host ~ $ echo $PS1 |
|
Die Ausgabe könnte wie folgt aussehen:
code: |
1:
|
\[\033[01;30m\]\u@\h\[\033[01;34m\] \w $\[\033[00m\] |
|
Das sieht jetzt etwas unübersichtlich aus, ist aber nur halb so schlimm - verstehen müssen wir es eigentlich nicht, dennoch der Vollständigkeit halber ein kurzer Überblick:
- \[ startet eine Sequenz von Zeichen, die nicht angezeigt werden.
- \033 Ein ASCII-Escape-Charakter, kann auch als \e geschrieben werden.
- [01;30m\] 01 bedeutet hier, dass der Text fett dargestellt wird, 30 ist die Farbe (hier grau), m beendet die Escape-Sequenz und \] "schließt" das \[ von oben.
- \u@ Name des aktuellen Users gefolgt von einem @-Zeichen.
- \h der Hostname.
- \[\033[01;34m\] das gleiche wie oben, bloß mit einer anderen Farbe.
- \w $ das aktuelle Verzeichnis gefolgt von einem Dollar-Zeichen.
- \[\033[00m\] wieder das gleiche wie schon die vergangen 2 Male - diese Einstellungen beziehen sich dann auf die Darstellung der eingetippten Kommandos.
Aber um zurück zum Thema zu kommen, die aktuelle Uhrzeit können wir einfügen, indem wir - z.B. am Anfang der PS1-Variable - ein " \A" einfügen. Da das aber noch reichlich unspektakulär ist, umschließen wir das Ganze mit eckigen Klammern und färben es grün ein:
code: |
1:
|
user@host ~ $ PS1="\[\033[0;32m\]\[[\A] $PS1" |
|
Die Farbe/Darstellung ist natürlich austauschbar. sofern alles passt, können wir unsere .bashrc entsprechend anpassen:
code: |
1:
2:
3:
4:
5:
|
#vorher
PS1='\[\033[01;30m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] '
#nachher
PS1='\[\033[0;32m\][\A] \]\[\033[01;30m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] '
|
|
Selbstverständlich gibt es neben \w, \A etc. noch weitere Parameter, diese finden sich in der Manpage der Bash unter PROMPTING
Mehr demnächst...
Letztes Update: 10.11.08
Geschrieben von rich20 am 25.08.2008 um 23:23:
Hallo Haui,
ist es recht, wenn man hier antwortet, oder sollte dies extra geschehen.
Habe deinen Tipp befolgt,
"\e[5~": history-search-backward
"\e[6~": history-search-forward
waren schon vorhanden und nachdem ich die # weggenommen habe, funktioniert die Suche mit <Bild-Auf>.
danach habe ich den Code für "Dateien suchen leicht gemacht " eingefügt.
Aber irgendwie funktioniert es bei mir nicht. Es lassen sich danach keine Buchstaben mehr in die Konsole eintippen.
Ubuntu 8.04
Geschrieben von Haui am 25.08.2008 um 23:31:
Zitat: |
Original von rich20
Hallo Haui,
ist es recht, wenn man hier antwortet, oder sollte dies extra geschehen. |
|
Hallo,
hier ist es ok.
Zitat: |
Aber irgendwie funktioniert es bei mir nicht. Es lassen sich danach keine Buchstaben mehr in die Konsole eintippen |
|
So wie sich das anhört, hast du die Funktionen in die
/etc/inputrc geschrieben, das ist aber falsch!
Alle Funktionen müssen in die bashrc, also für deinen User z.B.
/home/rich/.bashrc geschrieben werden. Sorry, wenn ich das nicht deutlich genug geschrieben habe. Hab's jetzt oben ergänzt.
Geschrieben von rich20 am 25.08.2008 um 23:49:
Nein Haui,
du hast es schon ganz deutlich geschrieben.
Es war wieder mal ein richtig schlampiger Fehler beim Lesen von mir.
Man sollte erst genau lesen, bevor man fragt.
Danke für den Tipp, es funktioniert wunderbar!
Geschrieben von Haui am 10.11.2008 um 22:19:
Seltsam...früher wurden bearbeitete Beiträge wieder "nach oben geschickt" - hast du da was geändert, dedie?
Geht wieder
Gruß dedie
Geschrieben von rich20 am 11.12.2008 um 02:04:
Hallo Haui,
gibt es eventuell auch eine vereinfachte, vor Allem genauere Textsuche für die Shell? Die integrierte Suche in Ubuntu habe ich nach einer Stunde entnervt abgebrochen.
Aber auch die Shell liefert nichts vernünftiges. Suchbegriff war "regelmäßig". Die Ergebnisse unten zeigen mir lediglich an, dass es irgendwo in meinem Userkonto Dateien mit diesen Texten gibt.
:~$ find /home/rich -type f -name "*.html" -exec grep regelmäßig {} \;
Die Pinsel wechselt regelmäßig rechte und linke Hand,
<p>regelmäßig ausgeführt werden sollen,</p>
:~$
oder
:~$ find /home/rich -type f -name "*.php" -exec grep regelmäßig {} \;
Es empfiehlt sich, die Homepage regelmäßig zu besuchen, um Updates und
Es empfiehlt sich, die Homepage regelmäßig zu besuchen, um Updates und
Es empfiehlt sich, die Homepage regelmäßig zu besuchen, um Updates und
:~$
Nachtrag: Tippfehler ausgebessert
Geschrieben von Haui am 11.12.2008 um 14:10:
Hallo,
mit deiner Befehlszeile bist du ja fast schon am Ziel. Um die Dateinamen mit auszugeben kannst du statt
grep einfach
grep -H verwenden. Das Ergebnis sieht dann etwa so aus:
Zitat: |
/home/rich/index.html: Die Pinsel wechselt regelmäßig rechte und linke Hand,
/home/rich/wasauchimmer.html: <p>regelmäßig ausgeführt werden sollen,</p> |
|
Falls du nur an den Dateinamen interessiert bist, bietet sich
grep -l an, das zeigt dir die Namen der Dateien an, die den Suchbegriff mindestens einmal enthalten.
HTH
Geschrieben von rich20 am 11.12.2008 um 14:53:
Hallo Haui,
funktioniert wunderbar. Diese Dateien hätte ich ansonsten nie im Leben gefunden.
Da frage ich mich, für was es diese integrierte Suchfunktion gibt, wenn diese bei "Enthält den Text" nach einer Stunde noch nichts gefunden hatte.
Mit deinem Befehl war das Ganze nach nicht mal 40 Sekunden erledigt.
Vielen vielen Dank!