给定一个仅显示“foo”,帮助或错误的 fish 脚本foo.fish
function foo
__parse_args $argv[1]
echo foo
end
function __parse_args --argument option
if test -z $option
return # No option to parse, return early
end
switch $option
case -h --help
echo "Shows this help and exits"
return 0 # How can we exit 0 instead of return?
case -\*
echo "Error: '$option' not a valid option"
return 1 # How can we exit 1 instead of return?
end
end
实际行为:
↪ foo -h
Shows this help and exits
foo
预期的行为:
↪ foo -h
Shows this help and exits
return
手册说它停止当前内部函数并设置函数的退出状态。在嵌套函数调用中,如何使用适当的退出代码尽早退出脚本?
请注意,我们不能使用
exit
,因为它会退出 shell 程序,而不仅仅是脚本。 最佳答案
除非您通过source
或.
运行脚本,否则它将在其自己的新Shell进程中运行。 exit
命令将终止该过程,并返回到调用该脚本的父 shell 程序; exit
的参数将是退出后立即在该父进程中的$status
的值。
如果您实际上是在交互式 shell 程序中定义foo
函数(通过source
或.
或在 shell 程序提示符下键入/粘贴,或在.fishrc或〜/.config中的启动文件中进行定义),则无法实现让__parse_args
从foo
返回。 foo
将必须显式检查__parse_args
的返回值(即,在调用$status
之后检查__parse_args
),然后在适当时立即返回。这也意味着,由__parse_args
决定在处理--help
时返回一个不同于在其他情况下成功返回的值。
但是,除非foo
的实际操作涉及对您的shell环境进行一些修改,否则我建议将其设置为可执行脚本文件而不是函数,例如,将其放入命令搜索foo
中某个位置的名为$PATH
的文件中:
#!/usr/bin/env fish
function foo
__parse_args $argv[1]
echo foo
end
function __parse_args --argument option
if test -z $option
return # No option to parse, return early
end
switch $option
case -h --help
echo "Shows this help and exits"
exit 0 # How can we exit 0 instead of return?
case -\*
echo "Error: '$option' not a valid option"
exit 1 # How can we exit 1 instead of return?
end
end
foo $argv
达到了预期的结果:> foo
foo
> foo -x
Error: '-x' not a valid option
[1]> foo -h
Shows this help and exits
>
关于shell - 如何从较低级别的函数中退出 fish 脚本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44484539/