我正在构建一个应该在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
线并让鱼通过(和其他贝壳类似)获取它。