Каково различие в этих двух средах удара?

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%, как время разработки переходит к бесконечности.

6
05.10.2013, 17:36
1 ответ

#!/usr/bin/env bash результаты в сценарии с помощью любого удара найдены первыми в $PATH.

В то время как удару свойственно быть расположенным в /bin/bash. Существуют случаи, где это не (различные операционные системы). Другое потенциальное использование состоит в том, когда существует несколько установленных оболочек удара (более новая версия в альтернативном местоположении как /usr/local/bin/bash).

Выполнение #!/usr/bin/env bash просто использует в своих интересах поведение env утилита.
env утилита обычно используется для управления средой при вызове программы (например; env -i someprog вытереть чистую среду). Однако, не обеспечивая аргументов кроме программы для выполнения это приводит к выполнению указанной программы, как найдено в $PATH.


Обратите внимание, что существует и преимущества и недостатки к выполнению этого.

Преимущества, как отмечалось ранее, в котором это делает сценарий портативным, если удар установлен в другом месте, или если /bin/bash слишком старо для поддержки вещей, которые сценарий пытается сделать.

Недостаток - то, что можно получить непредсказуемое поведение. Так как Вы во власти пользователя $PATH, это может привести к сценарию, выполняемому с версией удара, который имеет другое поведение, чем, что ожидает сценарий.

11
27.01.2020, 20:23

Теги

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