Определение новых команд fish в скрипте и анализ аргументов - PullRequest
1 голос
/ 09 июня 2019

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

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

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

Ответы [ 2 ]

1 голос
/ 09 июня 2019

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

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

1 голос
/ 09 июня 2019

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

  • Первая строка файла должна быть#!/usr/bin/fish (Измените этот путь, если ваша установка fish находится в другом месте. Вы можете проверить, позвонив по номеру which fish)
  • Начните писать свой скрипт fish, ваши аргументы будут $argv[1], $argv[2] ...etc
  • Дайте вашему сценарию права на выполнение: 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
...