Fi sh Shell argparse Делать что-то очень неожиданное - PullRequest
0 голосов
/ 16 апреля 2020

Я использую fi sh 3.1.0 в OS X 10.14.5.

Я новичок в fi sh и в argparse. Мне нравятся они оба.

Следующий простой тестовый код:

#!/usr/local/bin/fish

function afoo 
    set -l options (fish_opt -s h -l help)
    set options $options (fish_opt -s m -l max --required-val)
    set options $options (fish_opt -s n -l nnn --optional-val)

    argparse $options -- $argv

    echo "max" $_flag_max
    echo "nnn" $_flag_nnn
end

Должны создать два переключателя m и n. m должен принимать значение, а n может принимать значение.

Вот простой снимок экрана при тестировании этой элементарной функции в CLI терминала:

[/usr/local/bin/fish 3.1.0] ~ afoo -m foo -n baz
max foo
nnn
[/usr/local/bin/fish 3.1.0] ~ afoo -mfoo -nbaz
max foo
nnn baz
[/usr/local/bin/fish 3.1.0] ~ 

Почему argparse не анализирует пространство между ключом -n и его параметром, но анализирует пространство между ключом -m и его параметром?

Это сводит меня с ума. Я прочитал документацию десятки раз. Что я делаю не так?

PS Порядок переключателей не имеет значения.

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Почему argparse не анализирует пространство между ключом -n и его параметром, но анализирует пространство между ключом -m и его параметром?

-n занимает необязательный параметр . Они должны, по соглашению getopt, быть напрямую присоединены к аргументу опции.

Посмотрите, например,

echo never | grep --color never

Это не отключит цвет, вместо этого будет установлено значение auto (значение по умолчанию без аргументов) и поиск строки «never». Так что он покажет вам «никогда» в красном. Вместо этого вам придется использовать --color=never (или если у него есть короткий параметр "- c", тогда "-cnever" также будет приемлемым).

Argparse действует как обычный unix getopt (3) вариант разбора, который он также использует под прикрытием, потому что так действует остальная часть системы.

0 голосов
/ 16 апреля 2020

Отлично! Большое спасибо.

Если вы новичок ie, как я, вы можете найти более подробную информацию о том, на что указывают эти ответы, выполнив поиск переполнения стека для 'необязательного аргумента пространства getopt'.

0 голосов
/ 16 апреля 2020

Это потому, что n/nnn=? имеет необязательный параметр , тогда как m/max= имеет обязательный один. Эти строки являются выводом ваших вызовов fish_opt.

Неопционные аргументы сохраняются в $argv после успешного выполнения argparse. Таким образом, ваш baz заканчивается $argv.

...