getopt
по сравнению с getopts
кажется, религиозная проблема. Что касается аргументов против getopt
в Bash FAQ:
"getopt
не может обработать строки пустых аргументов", кажется, относится к известной проблеме с дополнительными аргументами, на которые она похожа getopts
не поддерживает вообще (по крайней мере, от чтения help getopts
для Bash 4.2.24). От man getopt
:
getopt (3) может проанализировать долгие опции с дополнительными аргументами, которым дают пустой дополнительный аргумент (но не может сделать этого для коротких опций). Этот getopt (1) дополнительные аргументы обработок, которые пусты, как будто они не присутствовали.
Я не знаю где"getopt
не может обработать [...] споры со встроенным пробелом", прибывает из, но давайте протестируем его:
test.sh:
#!/usr/bin/env bash
set -o errexit -o noclobber -o nounset -o pipefail
params="$(getopt -o ab:c -l alpha,bravo:,charlie --name "$0" -- "$@")"
eval set -- "$params"
while true
do
case "$1" in
-a|--alpha)
echo alpha
shift
;;
-b|--bravo)
echo "bravo=$2"
shift 2
;;
-c|--charlie)
echo charlie
shift
;;
--)
shift
break
;;
*)
echo "Not implemented: $1" >&2
exit 1
;;
esac
done
выполненный:
$ ./test.sh -
$ ./test.sh -acb ' whitespace FTW '
alpha
charlie
bravo= whitespace FTW
$ ./test.sh -ab '' -c
alpha
bravo=
charlie
$ ./test.sh --alpha --bravo ' whitespace FTW ' --charlie
alpha
bravo= whitespace FTW
charlie
Похож на проверку и помощника мне, но я уверен, что кто-то покажет, как я полностью неправильно понял предложение. Конечно, проблема мобильности все еще стоит; необходимо будет решить, сколько времени стоит инвестировать в платформы с более старым или никаким доступным Bash. Моя собственная подсказка должна использовать YAGNI, и инструкции KISS - Только разрабатывают для тех определенных платформ, которые Вы знаете, будут используемыми. Переносимость кода Shell обычно переходит к 100%, как время разработки переходит к бесконечности.
#!/usr/bin/env bash
результаты в сценарии с помощью любого удара найдены первыми в $PATH
.
В то время как удару свойственно быть расположенным в /bin/bash
. Существуют случаи, где это не (различные операционные системы). Другое потенциальное использование состоит в том, когда существует несколько установленных оболочек удара (более новая версия в альтернативном местоположении как /usr/local/bin/bash
).
Выполнение #!/usr/bin/env bash
просто использует в своих интересах поведение env
утилита.
env
утилита обычно используется для управления средой при вызове программы (например; env -i someprog
вытереть чистую среду). Однако, не обеспечивая аргументов кроме программы для выполнения это приводит к выполнению указанной программы, как найдено в $PATH
.
Обратите внимание, что существует и преимущества и недостатки к выполнению этого.
Преимущества, как отмечалось ранее, в котором это делает сценарий портативным, если удар установлен в другом месте, или если /bin/bash
слишком старо для поддержки вещей, которые сценарий пытается сделать.
Недостаток - то, что можно получить непредсказуемое поведение. Так как Вы во власти пользователя $PATH
, это может привести к сценарию, выполняемому с версией удара, который имеет другое поведение, чем, что ожидает сценарий.