# FAQ Tips > Tipps und Tricks >  schlauere Bash

## SeeksTheMoon

HIer gibt es etwas interessantes, mit dem man die bash aufmotzen kann:
http://www.caliban.org/bash/index.shtml

Das Teil heißt bash-completion und hilft uns TAB-Tasten-Junkies.
z.B. werden manpages ja normalerweise nicht per TAB angezeigt, man muss raten, wie der Befehl/die Funktion heißt, die man sucht.
Jetzt beginnt man den Befehl zu schreiben, drückt  nur noch TAB und sieht allle möglichen manpages:

z.B. will ich ein C-Programm schreiben und dort String-Funktionen einbauen, hab aber vergessen, wie die Funktion genau heißt, weiß aber, dass sie mit "str" anfängt.
Also: 
~>man str TAB TAB
strace       strcspn      strict       strncpy      strsignal    strtold
strange      strdup       string       strndup      strspn       strtoll
strcasecmp   strdupa      strings      strndupa     strstr       strtoq
strcat       strerror     strip        strnlen      strtod       strtoul
strchr       strerror_r   strlen       strpbrk      strtof       strtoull
strcmp       strfmon      strncasecmp  strptime     strtok       strtouq
strcoll      strfry       strncat      strrchr      strtok_r     strverscmp
strcpy       strftime     strncmp      strsep       strtol       strxfrm

Aha! strcpy hab ich gesucht...

Dann noch was, das für Java-Lover ganz nett ist: Wenn man eine Java-Klasse ausführen will und java TAB drückt, wird das .class (oder .java) am Ende automatisch weggelassen.

Wer sich mit ssh irgendwo einloggt, bekommt mit TAB eine Vervollständigung aller Hostnamen aus der known_hosts Datei. Dies klappt auch mit NFS, p4, cvs, ...

Schaut es euch an, das Ding ist Hammer!

Installhilfe:

 Die im tarball enthaltene Datei bash_completion nach /etc kopieren und im .bashrc File folgende Eintraege hinzufuegen: 
# START bash completion -- do not remove this line
 bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}
 if [ "$PS1" ] && [ $bmajor -eq 2 ] && [ $bminor '>' 04 ] 
&&[ -f /etc/bash_completion ]; then # interactive shell
 # Source completion code
 . /etc/bash_completion
 fi
 unset bash bmajor bminor
 # END bash completion -- do not remove this line

----------


## Xonic

Seit ich Knoppix 3.1 auf meiner kiste fahre, ist das bei mir von Haus aus da.

es ist echt nützlich. besonders in verbindung mit   _man_

----------


## Flightbase

*unterschreib*
möchte ich nicht missen.

----------


## xare

Bei der aktuellen Suse werden die man-pages auch vervollständigt. 
Den Java-hack könnt ich allerdings gut gebrauchen...

MfG Xare

----------


## prostetnik

... bei SuSE 8.0 auch
gruß
prostetnik

----------


## joey.brunner

das ist ja dick.... ich hab schon mla sowas gesehen, also ne shell, die von fsat jedem boardtool die optionen kanntte... ganz dick sowas

joey

----------


## Xonic

ist das eigentlich normal, dass wenn ich "apt-get i" gefolgt von TAB eingebe, es zu "apt-get install" autovervollständigt wird?

----------


## SeeksTheMoon

Ja, das Prog kennt die Parameter der wichtigsten Befehle und vervollständigt diese

----------


## leifg

also bash_completion is eht geil. weiss gar nicht wie ich vorher ohne ausgekommen bin

nur: "man <tab> <tab>" dauert etwas lange ( Display all 7550 possibilities? (y or n) )  :Wink: 

ansonsten super

sogar apt-get install x <tab> <tab> klappt

mfg

leifg

----------


## Schamane

> _Original geschrieben von leifg_ 
> *
> nur: "man <tab> <tab>" dauert etwas lange ( Display all 7550 possibilities? (y or n) ) 
> 
> *


da is aber jemand nicht geizig beim installieren gewesen  :Wink:

----------


## dragon's might

> _Original geschrieben von leifg_ 
> *
> sogar apt-get install x <tab> <tab> klappt
> *


wow! das hat mir noch gefehlt! :Smilie:

----------


## Discipulus

hm ... doofe Frage: Wie installiere ich diese unter Debian? Das RPM kann ich nicht installieren, und wenn ich ein deb-Paket daraus erstelle (mit alien) kommt:  

```
bash kollidiert mit bash-completion
```

----------


## gENOZIDe

Hi,

ich bekomme das irgendwie nicht hin. Ich habe die Datei 'bash_completion' unter /etc/ mit den Zugriffsrechten 777 abgelegt (777 deshalb, damit mir jetzt bloss ja nix wegen den Rechten dazwischen funkt  :Wink: ). Danach noch die paar Zeilen zum Starten in die /etc/.bashrc gepastet aber es will nicht laufen... habe mich schon mehrere Male ausgeloggt und wieder eingeloggt. Ich habe die Datei 'bash_completion' auch manuell ausgefuehrt... nix!  :Confused:

----------


## leifg

> _Original geschrieben von gENOZIDe_ 
> *Hi,
> 
> ich bekomme das irgendwie nicht hin. Ich habe die Datei 'bash_completion' unter /etc/ mit den Zugriffsrechten 777 abgelegt (777 deshalb, damit mir jetzt bloss ja nix wegen den Rechten dazwischen funkt ). Danach noch die paar Zeilen zum Starten in die /etc/.bashrc gepastet aber es will nicht laufen... habe mich schon mehrere Male ausgeloggt und wieder eingeloggt. Ich habe die Datei 'bash_completion' auch manuell ausgefuehrt... nix! *


machs so wie ich:

leg dir ein file an in dem du alles einfügst was du brauchst (u.a. auch bash_completion) und dann bindest du das file mit "test -e <absoluter pfad zum file> && . <absoluter pfad zum file>" in /etc/profile /etc/bash.bashrc, ~/.bashrc und sonstige configs file ein.

mfg

leifg

----------


## Schamane

habe gerade mein Debian ma auf unstable umgestellt, und siehe da, es ist jetzt auch dabei  :Wink:

----------


## Pixcy

> _Original geschrieben von Xonic_ 
> *ist das eigentlich normal, dass wenn ich "apt-get i" gefolgt von TAB eingebe, es zu "apt-get install" autovervollständigt wird?*


Du kannst ja einfach alles vervollständigen lassen! Der macht auch jede Datei und jedes Verzeichnis!

z.B. *cd /usr/src/l*  TAB ergibt *cd /usr/src/linux-2.4.19-*. Da muss man dann nurnoch seinen Senf dazugeben. Wow! So macht das fixe Arbeiten Spass.

Einfach rumprobieren, sag ich da nur! Wenn man nur *cd /usr* TAB TAB macht, zeigt der einem alle Möglichkeiten an, die man hat! Und löscht die Zeile dann ncht, sondern übernimmt die bis nach der Auflistung!

----------


## Schamane

@pixcy

das ging normal auch schon vorher

----------


## gENOZIDe

Es funktioniert immer noch nicht bei mir. Noch einen Tipp wie man das einbindet oder installieren kann?
Achja, und fuer euch hab ich auch noch nen Hinweis. Und zwar kann man sich das 2x TAB sparen indem man folgendes in die Datei */etc/inputrc*  hinzufuegt:

*set show-all-if-ambiguous on*

hf, geno

----------


## Discipulus

Was hast du den für ne Distri?

----------


## gENOZIDe

> _Original geschrieben von Discipulus_ 
> *Was hast du den für ne Distri?*


Ich habe Debian Woody 3.0 unstable/testing.

----------


## Discipulus

Ist nur ein Detail: Woody ist stable. Da gibt es noch sid und sarge, welche unstable und testing sind. Aber eben...nur ein Detail.
Ich kann dir leider auch nicht helfen, da ich es auch nicht hinbekomme mit Debian Woody, wie auch schon gepostet.

----------


## gENOZIDe

hm... komisch ist nur, dass ich es schon mal geschafft habe. Dann habe ich nur leider noch mal alles installieren wollen und schwubs war ich das schoene Features los  :Wink: . Ausserdem, bei Knoppix, ebenfalls Debian Woody 3.0, funktioniert es ja auch. Ich kapier es einfach nicht. Aber nur dafuer neu zu installieren habe ich auch (noch) keine lust.

----------


## ProfBunny

Hallo Leute,

bei debian woody ist das schon drin, man muß  nur in der /etc/bash.bashrc 
die auskommentierung entfernen.


Grüße Profbunny

----------


## gENOZIDe

> _Original geschrieben von ProfBunny_ 
> *Hallo Leute,
> 
> bei debian woody ist das schon drin, man muß  nur in der /etc/bash.bashrc 
> die auskommentierung entfernen.
> 
> 
> Grüße Profbunny*


das habe ich auch schon gemacht.... nix 


EDIT:

Krass0rst  :EEK!:  Es funktioniert jetzt ja doch !!! THX 1000 MAL !!!!!  :Big Grin:   :Big Grin:   :Big Grin:

----------


## Discipulus

Juhu ..... läuft auch bei mir  :Big Grin:

----------


## xcelsior

bei mir auch!! danke!

----------


## dragon's might

btw.:
Unter Debian ist's ganz einfach!

Kopiert die entpackte Datei nach /etc/
Dann editiert die /etc/bash.bashrc. Da steht drin :


```
                      

# System-wide .bashrc file for interactive bash(1) shells.

shopt -s checkwinsize

# enable bash completion in interactive shells

#if [ "$PS1" -a -f /etc/bash_completion ]; then
#    . /etc/bash_completion
#fi
```

Einfach auskomentieren, also sieht es dann so aus:


```
     

# System-wide .bashrc file for interactive bash(1) shells.

shopt -s checkwinsize

# enable bash completion in interactive shells

if [ "$PS1" -a -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi
```

That's it !  :Cool:

----------


## Ybbus

Hi!

Hab das Kommentar entfernt, aber klappt nicht.
Muss ich noch irgendwas machen, damit die bash.bashrc verarbeitet wird, oder sollte das so gehen?

Wie kann ich das Testen, ob ich diese completion funktionalität überhaupt habe?

also das bash_completion existiert bei mir...

Nur war es bei Knoppix so, dass er z.B. bei iptables -A P [TAB] [TAB] das POSTROUTING erkannt hat.
Macht er jetzt aber nich  :Frown: 

Gibts dafür ein apt-get-Paket?

----------


## ThorstenS

debian woody hat die Version 2.0.5a und die /etc/bash_completion ist immer da.
Nur in der /etc/bash.bashrc muß die # vor dem ". /etc/bash_completion" entfernt werden.
Dann funktioniert es.

Bei meiner SuSE 6.4 hatte ich mal nen geilen Hack in der inputrc
Dort habe ich nach einem langen iptables Befehl nur ipt[Pfeil nach oben] gedrückt und er ist durch die history und hat die ganzen Befehle angezeigt, die mit ipt anfangen.
Das war eine imense Arbeitserleichterung, leider finde ich das nicht mehr  :Frown: 

EDIT: iptables ist nur ein Beispiel, das gabs damals natürlich noch nicht.

----------


## neonknight

danke für den hinweis
gibt's übrigens auch als gentoo-ebuild

----------


## Ybbus

Also ich habe die KOmmentare entfernt, und es geht nicht...  :Frown:

----------


## ThorstenS

Dann lad dir nochmal aus dem o.g. Link das tgz und extrahiere es.
die bash_completion kopierst du über die existierende drüber (die ist glaube ich bei woody noch von April 2002) und dann wird es in allen Details funktionieren.

----------


## Ybbus

Hi!

Hab jetzt folgendes gemacht:

Runtergeladen:
http://www.caliban.org/files/bash/ba...0030607.tar.gz

Entpackt, nach /etc kopiert.

UNd so schaut meine bash.bashrc aus:

# System-wide .bashrc file for interactive bash(1) shells.

shopt -s checkwinsize

if [ "$PS1" -a -f /etc/bash_completion ]; then
 . /etc/bash_completion
fi


(Ist da vielleicht ein Fehler drin? Hab das per Hand da reingemacht....

Jedenfalls gehts nochnicht.

----------


## Ybbus

Was ich grad gemerkt habe:

Wenn ich manuell eingebe:

. /etc/bash_completion

Dann geht es. Was stimmt an der If-Abfrage nicht?

PS: Hab jetzt auch mal am Ende von bash.bashrc ein echo TEST eingefügt.

Anscheinend wird sie garnicht ausgeführt, denn erschienen ist es beim Einloggen nicht.

----------


## msi

ist sie ausfürbar und lesbar für deinen benutzer?

edit: die datei heißt nur .bashrc
und ist in dem homeverzeichnis des benutzers.

----------


## Ybbus

Also langsam versteh ich nichtsmehr.

Ich hab jetzt das hier in meine .bashrc geschrieben:




> if [ "$PS1" -a -f /etc/bash_completion ]; then
> . /etc/bash_completion
> echo TEST
> fi


Beim Login wird TEST angezeigt, also wird das Script wohl samt 
. /etc/bash_completion
ausgeführt.

Die Vevollständigung geht aber nicht. Sie funktioniert erst, wenn ich nochmals manuell:
. /etc/bash_completion per Hand eingebe, obwohl es doch eigentlich schon ausgeführt sein müsste.  Jedenfalls gehts dann dannach...
Nur beim Login nie automatisch vom Script her...

----------


## msi

was kommt den nach diesen zeilen noch in deiner .bashrc?

----------


## Ybbus

nichtsmehr

Das hab ich ganz am Ende der .bashrc angehängt

----------


## ThorstenS

schau auch mal in die .profile
Ich meine dort wird definiert, ob die ~./bashrc auch ausgeführt wird.
Evtl. ist es dort auskommentiert.

----------


## Ybbus

Hi!

Wenn es auskommentiert wäre, würde doch aber nicht das
echo TEST
verarbeitet werden, welches ich zum Test in die If-Abfrage eingebaut habe...
(s.o.)

----------


## prostetnik

> ... und im .bashrc File folgende Eintraege hinzufuegen:
> # START bash completion -- do not remove this line
> bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}
> if [ "$PS1" ] && [ $bmajor -eq 2 ] && [ $bminor '>' 04 ]
> &&[ -f /etc/bash_completion ]; then # interactive shell
> # Source completion code
> . /etc/bash_completion
> fi
> unset bash bmajor bminor
> # END bash completion -- do not remove this line


ich habe gem. README und Kommentar in der
/etc/bash.bashrc
den oben zitierten Eintrag in eine 
/etc/bash.bashrc.local
die ich selbst erstellt habe eingetragen, sodass die Erweiterung systemweit funktioniert
- hoffe ich ;-)
(...mir ist noch nicht klar, was bei mir schon vorher unter SuSE 8.0 funktioniert hat und was jetzt neu sein müsste)
gruß
prostetnik

----------


## zbled

oder einfach die z-shell (zsh) verwenden, die macht das von haus aus  :Smilie:

----------


## thermoman

Die in Debian integrierte Datei für bash_completion kennt auch die gängisten Parameter der gängisten Programme.

z.B.

dselect u<tab>

wird zu

dselect update

oder apt-get i<tab>

wird zu

apt-get install

Damit lässt sich eine ganze Menge an Tipparbeit sparen.

Tip: Wenn man für den SSH Zugang auf einer anderen Maschine die Authentifizierung via Schlüsselpaar macht (ohne Passworteingabe), dann kann man sogar den Pfad vervollständigen.

z.B:

scp /etc/fstab user@remotehost:/e<tab> wird nach kurzer Pause zu 

scp /etc/fstab user@remotehost:/etc/

mfg,
thermoman

----------


## matzel

Hey, kann es sein das die Seite von bash_completation [http://www.caliban.org] zur Zeit down ist ?

----------


## Samsara

ist Syntax-highlighting auf der Bash, z.B. wenn ich 'perl -e' benutze.

Kennt da jemand was fuer?

Danke,

Samsara

PS: Bash ist doch sicher GPL, oder? Da kann man ja selber dran weiterschreiben *traeum*
PPS: http://www.mrunix.de/forums/showthre...threadid=32984

----------


## SeeksTheMoon

die bash macht das nicht, das machen höchstens die Konsolenprogramme, z.B. ls --color

----------


## ProfBunny

Hätte auch nochmal eine Frage dazu, bash completition funktioniert bei mir in xtrem.
Aber in Eterm und direkt in der console funktioniert's nicht.

Jemannd ne Idee wieso das so ist?

Mfg

Profbunny

----------

