给定一个仅显示“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_argsfoo返回。 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/

10-09 09:24