快速提问。是否可以通过在鱼中编写脚本来定义新命令?我想按照以下方式编写新命令:
newFunction --flag1 flag1Input --flag2 flag2Input then space delimited arguments
这个新功能只能通过使用已经定义的命令来实现,而我只是希望能够将标志传递给这个新功能。这有可能吗?还是我必须使用另一种语言(如Python)为我的假设命令创建可执行文件?
答案 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
要解析参数,可以将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
答案 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。