首页 > 解决方案 > 根据使用的 shell 有条件地向前移动

问题描述

我正在尝试编写一个.functions点文件,目的是source $HOME/.functions在我的 bash、zsh 和 fish 配置文件中加载它()。我已经用另一个(.aliases)成功地做到了。但是现在我面临一个问题,原因是鱼不符合 posix 标准。

问题是别名在三个 shell 之间共享语法,但是当涉及到函数时,fish 有自己的语法(function my_func; #code; end而不是function my_func { #code; })。例如,考虑:

鱼:

function say_hello
    echo "hello";
end

重击/Zsh:

say_hello() {
    echo "hello";
}

这使我无法将它们“按原样”写入文件中,因此我正在考虑编写一个条件,例如if [ "$0" = "bash" ] || [ "$0" = "zsh" ]; then #functions_POSIX; else #functions_fish; fi. 但是,这种条件语法在 fish 中也不可用!

那就是我被困的地方。我宁愿每个 shell 都没有单独的文件。

先感谢您。

标签: bashshellconditional-statementsfishdotfiles

解决方案


在我看来,唯一可行的答案是将定义分开。

即使您想出某种方法来绕过 fish 检查整个文件的语法这一事实(因此,无论您在哪里放置 bash 函数定义,它都会在不执行任何操作的情况下给出语法错误),这也不会产生一个可读的文件很高兴编辑。你只会与黑客作斗争。

而且函数定义无论如何都不能共享,因为它不仅仅是简单的搜索和替换fito end- 语义不同,例如命令替换只会在换行符上拆分,各种特殊变量 ( $@) 以不同的方式工作,数组完全不同,等等......

这意味着将其设置为单个文件是不可行或没有帮助的,因此请改为使用您的函数脚本(如果它们不修改 shell 的环境)或围绕一个脚本进行包装以更改环境,或者只编写两次。


推荐阅读