快问。是否可以通过在 Fish 中编写脚本来定义新命令?我想按照以下方式编写一个新命令:
newFunction --flag1 flag1Input --flag2 flag2Input then space delimited arguments
Run Code Online (Sandbox Code Playgroud)
这个新函数只能以函数的方式使用已经定义的命令,我只是希望能够将标志传递给这个新函数。这可能吗,还是我必须使用另一种语言(例如 Python)来为我的假设命令创建可执行文件?
当然!就像在 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)
要解析参数,您可以将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)
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)