在脚本中定义新的fish命令并解析参数

时间:2019-06-09 03:06:48

标签: fish

快速提问。是否可以通过在鱼中编写脚本来定义新命令?我想按照以下方式编写新命令:

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

这个新功能只能通过使用已经定义的命令来实现,而我只是希望能够将标志传递给这个新功能。这有可能吗?还是我必须使用另一种语言(如Python)为我的假设命令创建可执行文件?

2 个答案:

答案 0 :(得分:1)

当然!就像使用bash(或实际上是任何一种解释语言)一样,您需要做的就是创建一个文件,为其赋予执行权限,并在其中编写您的fish脚本!

  • 文件的第一行应为#!/usr/bin/fish(如果您的fish安装位于其他位置,请修改该路径。可以通过调用which fish进行检查)
  • 开始编写鱼脚本,您的参数将是$argv[1]$argv[2] ...等等
  • 授予脚本执行权限:chmod +x myscript
  • 将脚本放入$PATH中的某个位置(例如/usr/local/bin)中,以便您可以像系统中的其他命令一样调用它。

这是一个无用的示例脚本,可以打印出您传递的参数:

#!/usr/bin/fish

for i in $argv
        echo $i
end

要解析参数,可以将argparsefish_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

答案 1 :(得分:1)

请参阅内置的argparse。通过该命令,可以以与大多数程序解析CLI args相同的方式相对容易地解析fish函数或脚本中的参数。如果您的fish安装程序已将标准fish函数放在 / usr / local / share / fish / functions / 中,则可以cd到该目录(或安装目录),grep argparse *到了解标准fish函数如何使用argparse

我曾说过,我不建议将fish作为创建新“命令”的通用脚本语言。我使用fish作为交互式外壳,并且有很多fish函数要用作交互式fish外壳中的命令。但是,对于一般的非交互式脚本,我使用并建议使用标准的POSIX shell,例如bash或ksh。