Определение новых рыбных команд в скрипте и анализ аргументов

Быстрый вопрос. Можно ли определять новые команды с помощью скриптов в fish? Я хочу запрограммировать новую команду примерно так:

newFunction --flag1 flag1Input --flag2 flag2Input then space delimited arguments

Эта новая функция будет использовать только уже определенные команды так, как это делают функции, я просто хочу иметь возможность передавать флаги этой новой функции. Возможно ли это, или мне нужно использовать другой язык, например Python, для создания исполняемого файла для моей гипотетической команды?


person Anthony Monterrosa    schedule 09.06.2019    source источник


Ответы (2)


Конечно! Как и в bash (или на любом другом интерпретируемом языке), все, что вам нужно сделать, это создать файл, дать ему права на выполнение и написать в нем свой скрипт для рыбы!

  • Первая строка файла должна быть #!/usr/bin/fish (измените этот путь, если ваша установка Fish находится в другом месте. Вы можете проверить, позвонив which fish)
  • Начните писать свой рыбный скрипт, ваши аргументы будут $argv[1], _4 _... и т. Д.
  • Предоставьте своему скрипту права на выполнение: chmod +x myscript
  • Поместите свой сценарий где-нибудь в вашем $PATH (например, /usr/local/bin), чтобы вы могли вызывать его, как другие команды в системе.

Вот бесполезный пример сценария, который распечатывает переданные вами аргументы:

#!/usr/bin/fish

for i in $argv
        echo $i
end

Для анализа аргументов вы можете использовать argparse с fish_opt.

Что вы делаете: вы указываете, какие у вас флаги, с помощью fish_opt вот так:

set -l options (fish_opt -s n -l name --required-val)
set options $options (fish_opt -s h -l help)

где за -s следует краткая форма вашего флага, а за -l следует полная форма.

Затем вы используете argparse для анализа своих аргументов следующим образом:

argparse $options -- $argv

Затем вы можете проверить свои флаги следующим образом:

if set -q _flag_help
    echo "Haalp!"
    return 0
end

Обратите внимание, что независимо от имени вашего флага, он будет установлен в переменную формата _flag_myflag

Вот полный пример:

#!/usr/bin/fish

set -l options (fish_opt -s n -l name --required-val)
set options $options (fish_opt -s h -l help)

argparse $options -- $argv

if set -q _flag_help
    echo "Haalp!"
    exit 0
end

if set -q _flag_name
    echo My name is $_flag_name
    exit 0
end

Теперь назовем это:

$ myscript
$ myscript --help
Haalp!
$ my_script --name "Anthony"
My name is Anthony
person Adam Zahran    schedule 09.06.2019
comment
Как определить флаги для использования с этим скриптом? Под флагами я подразумеваю именованные аргументы в командной строке. - person Anthony Monterrosa; 09.06.2019

См. Встроенную argparse. Эта команда позволяет относительно легко анализировать аргументы в функции или скрипте Fish аналогично тому, как большинство программ анализируют аргументы CLI. Если в вашей установке Fish стандартные функции Fish помещены в / usr / local / share / fish / functions /, вы можете перейти в этот каталог (или туда, где они были установлены) и grep argparse *, чтобы увидеть, как стандартные функции рыбы используют argparse.

При этом я не рекомендую fish как язык сценариев общего назначения для создания новых «команд». Я использую рыбу в качестве своей интерактивной оболочки, и у меня есть довольно много функций рыбы, предназначенных для использования в качестве команд в интерактивной оболочке рыбы. Однако для обычных неинтерактивных сценариев я использую и рекомендую использовать стандартную оболочку POSIX, такую ​​как bash или ksh.

person Kurtis Rader    schedule 09.06.2019
comment
Раздумайте, почему вы не рекомендуете рыбу в качестве языка сценариев? По сравнению с bash и ksh. Очевидно, что bash более популярен, но для меня это не важно. Я считаю, что рыба намного более читабельна. - person Anthony Monterrosa; 12.06.2019