Bash: Помогите отточить пользовательскую функцию

С GNU find , find / your / file -delete может работать.

1
01.09.2017, 02:52
2 ответа

если в m) не работает, в том смысле, что если я опускаю аргумент, Bash ходатайствует и выгоняет меня из сеанса;

Вы указываете getopts m:p option. :после mозначает, что вам нужен аргумент. Если вы его не предоставите, это ошибка.

После бега: wsgc -m "Yo!" -p, меня выгоняют из сессии.

Что вы имеете в виду, когда вас выгоняют из сессии? Исчезает ли оболочка? Тогда это потому, что вы создали сценарий, а не выполнили его.

При этом я настоятельно рекомендую использовать getoptвместо getopts.

2
27.01.2020, 23:24
  • Если опция -mне получает значение, вы exitиз оболочки.
  • Если вы используете опцию -p, вы exitиз оболочки.
  • Если вы используете недопустимую опцию, вы exitиз оболочки.

Во всех этих случаях вы должны return, а не exit, и во всех случаях, кроме второго, вы должныreturn 1(сигнализировать об ошибке ). Кроме того, сообщения об ошибках должны быть перенаправлены в стандартный поток ошибок с помощью >&2.

Вот версия вашей функции с некоторыми изменениями, из-за которых она ничего не выводит, если синтаксический анализ командной строки не прошел успешно.

wsgc () {
    local OPTIND=1
    local out=( "git add -A" )

    while getopts 'm:p' opt; do
        case "$opt" in
            m)  out+=( "git commit -m '$OPTARG'" ) ;;
            p)  out+=( 'git push' ) ;;
            *)  return 1 ;;
        esac
    done

    printf '%s\n' "${out[@]}"
}

Если вам нужно наложить порядок вывода (, git pushбудет выведено последним, только если -pпоследним в командной строке с указанной выше функцией ), тогда используйте флаги. Это также , а не выводит несколько команд, если опция используется несколько раз.

wsgc () {
    local OPTIND=1

    local message
    local do_push=0

    while getopts 'm:p' opt; do
        case "$opt" in
            m)  message="$OPTARG" ;;
            p)  do_push=1 ;;
            *)  return 1 ;;
        esac
    done

    local out=( "git add -A" )

    if [[ -n "$message" ]]; then
        out+=( "git commit -m '$message'" )
    fi

    if (( do_push )); then
        out+=( 'git push' )
    fi

    printf '%s\n' "${out[@]}"
}

Этот последний бит функции можно было бы сократить до

local out=( "git add -A" )

[[ -n "$message" ]] && out+=( "git commit -m '$message'" )
(( do_push ))       && out+=( 'git push' )

printf '%s\n' "${out[@]}"
1
27.01.2020, 23:24

Теги

Похожие вопросы