если в m) не работает, в том смысле, что если я опускаю аргумент, Bash ходатайствует и выгоняет меня из сеанса;
Вы указываете getopts m:p option
. :
после m
означает, что вам нужен аргумент. Если вы его не предоставите, это ошибка.
После бега: wsgc -m "Yo!" -p, меня выгоняют из сессии.
Что вы имеете в виду, когда вас выгоняют из сессии? Исчезает ли оболочка? Тогда это потому, что вы создали сценарий, а не выполнили его.
При этом я настоятельно рекомендую использовать getopt
вместо getopts
.
-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[@]}"