bash - 根据使用的 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 都没有单独的文件。
先感谢您。
解决方案
在我看来,唯一可行的答案是将定义分开。
即使您想出某种方法来绕过 fish 检查整个文件的语法这一事实(因此,无论您在哪里放置 bash 函数定义,它都会在不执行任何操作的情况下给出语法错误),这也不会产生一个可读的文件很高兴编辑。你只会与黑客作斗争。
而且函数定义无论如何都不能共享,因为它不仅仅是简单的搜索和替换fi
to end
- 语义不同,例如命令替换只会在换行符上拆分,各种特殊变量 ( $@
) 以不同的方式工作,数组完全不同,等等......
这意味着将其设置为单个文件是不可行或没有帮助的,因此请改为使用您的函数脚本(如果它们不修改 shell 的环境)或围绕一个脚本进行包装以更改环境,或者只编写两次。
推荐阅读
- python - CSV 数据源不支持 pyspark 中的空数据类型
- django - 如果之前已经编辑过评论,如何使其在评论旁边显示“已编辑”的永久消息?
- azure-active-directory - 如何获取下载 URL onedrive graph api?
- python - 如何使用 apply_style_by_indexes() 在单个单元格上应用样式框架
- javascript - CSS 定位 - mobilemenubar
- batch-file - 用于在文件夹中获取匹配表达式文件名的批处理脚本
- python - 如何迭代直到所有条目都在给定列中?
- php - 找不到 Wordpress 错误放置的 CSS 位置
- flutter - Flutter url_launcher 未在发布模式下启动 url
- gnu-parallel - GNU 并行:针对服务运行测试 - 提前失败