Datum Tags bash

Die Bourne-Again-Shell, bekannt unter dem Kurznamen bash, hat viele nette Eigenschaften.

Eine ist die Vervollständigung von Pfad-Namen. Dazu tippt man bekanntlich den Anfang ein und drückt die Tabulator-Taste. Nicht ganz so bekannt ist, dass die Vervollständigungsfunktion auch für andere Elemente als Filenamen funktioniert.

Mit der Verbreiteten Erweiterung bash_completion wird z.B. bei Programmen wie ssh oder telnet, die als Argument einen Rechnernamen haben, dieser Name entsprechend ergänzt. Dazu müssen die möglichen Rechner in der Datei /etc/hosts gelistet sein. Oder es werden bei Programmen wie su die Nutzernamen aus /etc/passwd ergänzt.

Es ist auch nicht schwierig, eigene Erweiterungen zu schreiben. So habe ich in meinen Directory-Baum ein Verzeichnis, die ich häufig als Ausgangspunkt zur Dateisuche nutze, als eine Art alternatives Home-Verzeichnis (konkret ist dies ein Link auf ein aktuelles Projektverzeichnis). Dafür habe ich in meiner .bash_profile die Zeile

function cdc () { cd ~/Doc/current/$*; }

die als ein spezieller Change-Directory-Befehl mit relativen Bezug zu dem current-Directory arbeitet.

Durch folgenden (nicht ganz optimierten) Code funktioniert die Bash-Vervollständigung auch für cdc:

# Completation
function cmpl_path(){ 
    local cur pre ctest

    pre=$1
    cur=$pre${COMP_WORDS[COMP_CWORD]:-*}
    ctest=`echo $cur*/ | cut -f 1 -d' ' `

    if [ -z "${COMP_WORDS[COMP_CWORD]}" ]; then
        COMPREPLY=( `ls -d -R $cur* | sed -e "s#${pre}##g" ` );
    elif [ -d $ctest ]; then
        COMPREPLY=( `ls -d -R $cur*/ 2> /dev/null | sed -e "s#${pre}##g" ` );
    else
        COMPREPLY='';
        echo -n '\a' 
    fi
}

function cmpl_current() {
    cmpl_path "/Users/mwerner/Doc/current/"
}

complete -o nospace -F cmpl_current cdc

Die Bedeutung der Variablen COMP_WORDS und COMPREPLY kann in der Bash-Manualseite nachgeschlagen werden.

Wie man sieht, können leicht weitere Funktionen für andere Spezial-cd-Befehle definiert werden.


Kommentare