在脚本中定义新的 fish 命令并解析参数
Defining new fish commands in a script and parse arguments
快速提问。是否可以通过在 fish 中编写脚本来定义新命令?我想按照以下方式编写一个新命令:
newFunction --flag1 flag1Input --flag2 flag2Input then space delimited arguments
这个新函数只能通过以函数的方式使用已经定义的命令,我只想能够将标志传递给这个新函数。这可能吗,还是我必须使用另一种语言,如 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
要解析参数,您可以使用 argparse with 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
参见 argparse
内置函数。该命令使得解析 fish 函数或脚本中的参数变得相对容易,其方式与大多数程序解析 CLI 参数的方式相同。如果您的 fish 安装已将标准的 fish 函数放在 /usr/local/share/fish/functions/ 中,那么您可以 cd 到该目录(或安装它们的任何位置)并 grep argparse *
看看如何标准的 fish 函数使用 argparse
.
话虽如此,我不推荐将 fish 作为创建新内容的通用脚本语言 "commands"。我使用 fish 作为我的交互式 shell 并且有相当多的 fish 函数可以用作交互式 fish shell 中的命令。但是,对于一般的 non-interactive 脚本,我使用并推荐使用标准的 POSIX shell,例如 bash 或 ksh。
快速提问。是否可以通过在 fish 中编写脚本来定义新命令?我想按照以下方式编写一个新命令:
newFunction --flag1 flag1Input --flag2 flag2Input then space delimited arguments
这个新函数只能通过以函数的方式使用已经定义的命令,我只想能够将标志传递给这个新函数。这可能吗,还是我必须使用另一种语言,如 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
要解析参数,您可以使用 argparse with 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
参见 argparse
内置函数。该命令使得解析 fish 函数或脚本中的参数变得相对容易,其方式与大多数程序解析 CLI 参数的方式相同。如果您的 fish 安装已将标准的 fish 函数放在 /usr/local/share/fish/functions/ 中,那么您可以 cd 到该目录(或安装它们的任何位置)并 grep argparse *
看看如何标准的 fish 函数使用 argparse
.
话虽如此,我不推荐将 fish 作为创建新内容的通用脚本语言 "commands"。我使用 fish 作为我的交互式 shell 并且有相当多的 fish 函数可以用作交互式 fish shell 中的命令。但是,对于一般的 non-interactive 脚本,我使用并推荐使用标准的 POSIX shell,例如 bash 或 ksh。