Моя функция bash запускается только один раз для каждого терминала

6

Когда я пытаюсь запустить мою функцию bash, определенную в .bashrc, во второй раз в том же терминале, она не работает.

Код следующий:

function nos (){
    local option
        while getopts cs option
            do
            case $option in
                s)
                    #start my server
                ;;
                c)
                    local cdir="~/mydirectory"
                    local cdir_arg=""
                    case $OPTARG in
                        p)
                            local cdir_arg="anotherdirectory"
                        ;;
                    esac
                    local cdir="${cdir}${cdir_arg}"
                    cd $cdir
                    ;;
                *)
                    echo 'This function doesnt have Super Cow Powers'
                    return 1
                ;;
            esac
    done
}

Я запускаю это:

nos -c

он переходит в ~ / mydirectory

ok, отработано.

, но затем я делаю это:

cd ~
nos -c

и ничего не происходит.

    
задан RjQuery 22.09.2012 в 23:49
источник

1 ответ

7

Компонент getopts отслеживает, насколько он прошел через опции с помощью переменной OPTIND . Во второй раз, когда вы запускаете функцию, $OPTIND сохранила свое значение из предыдущего вызова, поэтому оболочка считает, что она уже завершила обработку параметров. Дополнительную информацию см. В описании getopts в руководстве.

Объявить OPTIND и OPTARG как локальные функции.

В вашей функции есть еще одна ошибка, которая заключается в том, что ~ не разворачивается между двойными кавычками. Сделайте local cdir=~/mydirectory или local cdir="$HOME/mydirectory"

    
ответ дан Gilles 23.09.2012 в 00:23
источник