# plik receptury: func_cd

# Funkcja umożliwia wykorzystanie polecenia 'cd ...' do zmiany katalogów o 2 poziomy
# w góre, 'cd ....' do zmiany o 3 poziomy w góre itd. (podobnie jak 4NT/4DOS)
# Użycie: cd ..., itp.

function cd {

    local option= length= count= cdpath= i= # Zasięg lokalny i pusta wartość początkowa

    # Jeśli zostały podane opcje -L lub -P (dowiązania symbolicznego), należy je
    # zachować, a następnie usunąć
    if [ "$1" = "-P" -o "$1" = "-L" ]; then
        option="$1"
        shift
    fi

    # Czy jest wykorzystywana specjalna składnia? Sprawdzenie, czy zmienna $1 nie jest
    # pusta. Sprawdzenie, czy trzy pierwsze znaki $1 to '...'. Sprawdzenie, czy nie
    # występuje znak ukośnika - jeżeli operacja podstawienia się nie powiedzie,
    # znak ukośnika nie występuje. Wykonanie procedur startowych jest możliwe tylko w
    # powłokach bash 2.0 i wersjach późniejszych.
    if [ -n "$1" -a "${1:0:3}" = '...' -a "$1" = "${1%/*}" ]; then
        # Specjalna składnia jest wykorzystywana
        length=${#1}  # Zakładamy, że zmienna $1 przechowuje tylko znaki kropki,
                      # które należy.
        count=2       # 'cd ..' nadal oznacza przejście o jeden poziom w górę, pierwsze
                      # dwa znaki są więc ignorowane.

        # Przechodzenie o jeden katalog w góre, aż do wyczerpania znaków kropki
        for ((i=$count;i<=$length;i++)); do
            cdpath="${cdpath}../" # Utworzenie ścieżki
        done

        # Wykonanie samego polecenia cd
        builtin cd $option "$cdpath"
    elif [ -n "$1" ]; then
        # Specjalna składnia NIE jest wykorzystywana - zwykłe polecenie cd
        builtin cd $option "$*"
    else
        # Specjalna składnia NIE jest wykorzystywana - polecenie przejścia do katalogu domowego
        builtin cd $option
    fi
} # koniec funkcji cd
