停止鱼抱怨: 鱼:$?不是退出状态。在fish中,请使用$status

停止鱼抱怨: 鱼:$?不是退出状态。在fish中,请使用$status

我正在构建一个应该在csh、 、 中运行的脚本bash,并且fish无需任何更改:

这在所有 shell 中都做了正确的事情,

perl -e '$bash=shift;$csh=shift;for(@ARGV){unlink;rmdir;}if($bash=~s/h//){exit$bash;}exit$csh;' "$?h" "$status" $PARALLEL_TMP
                                                                                      

除了fish抱怨:

fish: $? is not the exit status. In fish, please use $status.

有没有一种兼容的方式可以告诉鱼:请不要警告,我知道我在做什么。

答案1

$ bash -c 'false; echo "[$status]" "[`echo \$?h`]"'
[] [1h]
$ csh -c 'false; echo "[$status]" "[`echo \$?h`]"'
[1] [0]
$ fish -c 'false; echo "[$status]" "[`echo \$?h`]"'
[1] [`echo $?h`]

`利用中并不特殊的事实fish,并且类似 Bourne 的 shell 在 中进行额外级别的反斜杠处理`...`

您还应该能够使用eval所有三个 shell 都支持的 , 并在某个环境变量中为所有三个 shell 准备好不同的代码,这将简化事情。

if ($csh || $fish) {
   ENV{CHECK_STATUS} = q{perl -e '...' $status};
} else {
   ENV{CHECK_STATUS} = q{perl -e '...' "$?"};
}
exec $shell, "-c", ...;

shell 代码将是eval "$CHECK_STATUS"(请注意 for csh,$CHECK_STATUS不得包含换行符)。

答案2

有没有一种兼容的方式可以告诉鱼:请不要警告,我知道我在做什么。

那没有。 Fish 和其他 shell 之间的交叉兼容脚本是不是一件事,因为鱼是不兼容

在大多数情况下,您想要做的是选择一个 shell 并为其编写一个脚本,其中包含 shebang 和所有内容,最广泛可用的选择是“/bin/sh”。

然后,fish 就可以运行您的脚本,就像运行用 python 或 ruby​​ 编写的脚本或用 C 编写的程序一样。

在某些情况下,您的脚本确实需要 shell,source因为您希望它影响 shell 中的环境更改。在这种情况下,最简单的方法就是打印脚本

export var=val

/path/to/script | source线并让鱼通过(和其他贝壳类似)获取它。

相关内容