getopts не работает внутри .bashrc

У меня есть файл:

аргумент

#!/bin/bash

function parse ()
{
    echo "in parse"
    echo "starting to parse args $@"

    while getopts "pq:" opt; do
        echo "parsing arg $opt"

        case "$opt" in
            p)  echo "got option p" ;;
            q)  echo "got option q with value ${OPTARG}" ;;
        esac

    done
}

parse "$@"

Это работает правильно:

balter$ bash argtest -pq 9
in parse
starting to parse args -pq 9
parsing arg p
got option p
parsing arg q
got option q with value 9
balter$ source argtest
in parse
starting to parse args
balter$ parse -pq 9
in parse
starting to parse args -pq 9
parsing arg p
got option p
parsing arg q
got option q with value 9

Однако, если у меня есть такая же функция в моем файле ~/.bashrc, я получаю:

balter$ tail -16 ~/.bashrc
function parse ()
{
    echo "in parse"
    echo "starting to parse args $@"

    while getopts "pq:" opt; do
        echo "parsing arg $opt"

        case "$opt" in
            p)  echo "got option p" ;;
            q)  echo "got option q with value ${OPTARG}" ;;
        esac

    done
}

balter$ source ~/.bashrc
balter$ parse -pq 9
in parse
starting to parse args -pq 9

Я заметил что-то странное в getopts:

balter$ getopts
getopts: usage: getopts optstring name [arg]
balter$ which getopts
which: no getopts in (<other paths>:/bin:/usr/local/bin:/usr/bin:/opt/condor/bin)

ИЗМЕНИТЬ ХА! Решение найдено здесь Использование getopts внутри функции Bash

Это работает:

function parse ()
{
    echo "in parse"
    echo "starting to parse args $@"

    local OPTIND
    local OPTARG
    local opt

    while getopts "pq:" opt; do
        echo "parsing arg $opt"

        case "$opt" in
            p)  echo "got option p" ;;
            q)  echo "got option q with value ${OPTARG}" ;;
        esac

    done
}

Если кто-то хочет объяснить проблему local, я буду рад услышать. Кроме того, если кто-то хочет объяснить, что такое which getopts, я буду рад это услышать.


person abalter    schedule 18.02.2017    source источник
comment
Появляется ли строка с настройкой export PATH перед определением функции или после в .bashrc   -  person Inian    schedule 18.02.2017
comment
@Inian Перед функцией. Что вы получаете с which getopts?   -  person abalter    schedule 18.02.2017
comment
Вы уверены, что обновляете путь в другом месте в .bashrc, потому что проблема, похоже, заключается в том, что он не может найти путь, где установлен getopts, в тот момент, когда вы запускаете функцию.   -  person Inian    schedule 18.02.2017
comment
Оказывается, он находит getopts (каким-то образом). Проблема была в локальных переменных!   -  person abalter    schedule 18.02.2017
comment
Приятно, что вы уловили это, но я закрываю этот вопрос, чтобы опубликовать его как дубликат того, которым вы поделились, чтобы вы не привлекали сюда самоуверенные ответы (или) спам.   -  person Inian    schedule 18.02.2017