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

Ant*_*osa 3 fish

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

newFunction --flag1 flag1Input --flag2 flag2Input then space delimited arguments
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*ran 5

当然!就像在 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
Run Code Online (Sandbox Code Playgroud)

要解析参数,您可以将argparseFish_opt结合使用。

你要做的是:你指定你的标志是什么,fish_opt如下所示:

set -l options (fish_opt -s n -l name --required-val)
set options $options (fish_opt -s h -l help)
Run Code Online (Sandbox Code Playgroud)

其中-s后面是您的标志的缩写形式,-l 后面是完整形式。

然后你可以argparse像这样解析你的参数:

argparse $options -- $argv
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样检查你的标志:

if set -q _flag_help
    echo "Haalp!"
    return 0
end
Run Code Online (Sandbox Code Playgroud)

请注意,无论您的标志名称是什么,它都会被设置为格式的变量_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
Run Code Online (Sandbox Code Playgroud)

现在我们称它为:

$ myscript
$ myscript --help
Haalp!
$ my_script --name "Anthony"
My name is Anthony
Run Code Online (Sandbox Code Playgroud)