![为什么 sh (不是 bash)抱怨我的 .bashrc 中定义的函数?](https://linux22.com/image/159668/%E4%B8%BA%E4%BB%80%E4%B9%88%20sh%20%EF%BC%88%E4%B8%8D%E6%98%AF%20bash%EF%BC%89%E6%8A%B1%E6%80%A8%E6%88%91%E7%9A%84%20.bashrc%20%E4%B8%AD%E5%AE%9A%E4%B9%89%E7%9A%84%E5%87%BD%E6%95%B0%EF%BC%9F.png)
当我打开终端会话时,我得到了这个:
sh:导入“read.json”的函数定义时出错
sh:导入“ts-project”的函数定义时出错
sh 不喜欢这些函数,因为它们看起来像:
read.json(){
::
}
和
ts-project(){
::
}
真正的问题是 - 为什么要sh
触摸/解释这些文件?我在 MacOS 上,以前见过这个,这真是一个谜。我认为只有 bash 会加载这些文件。
更新:bash 和 sh 没什么特别的。当我在终端中输入 bash 时,我得到了这个:
alex$ bash
beginning to load .bashrc
finished loading .bashrc
bash-3.2$
当我sh
在终端输入时,我得到:
alex$ sh
sh: error importing function definition for `read.json'
sh: error importing function definition for `ts-project'
sh-3.2$
答案1
bash
当伪装成 POSIX shell 尝试从环境中导入这些函数时,而不是通过解释类似的文件来加载它们时,就会发生该错误~/.bashrc
。简化示例:
foo.bar(){ true; }; export -f foo.bar; bash --posix -c true
bash: error importing function definition for `foo.bar'
我原本希望bash
在 posix 模式下不要从环境中加载函数,但是确实如此,并且只有当他们的名字包含有趣的字符时才会抱怨。
请注意,当设置或环境变量或使用/进行编译时,它bash
也会以 posix 模式运行。POSIXLY_CORRECT
POSIX_PEDANTIC
--enable-strict-posix-default
STRICT_POSIX
/bin/sh
后者似乎是MacOS 上的情况(看看这里for ),我预计在使用orPRODUCT_NAME = sh
等库函数时也会触发此错误。popen(3)
system(3)
答案2
答案3
那么造成这种情况的原因是我在 ~/.bashrc 文件中获取了一些 bash 脚本,如下所示:
for f in "$HOME/.oresoftware/bash/"*; do
. "$f"
done;
所以我只是将其更改为:
for f in "$HOME/.oresoftware/bash/"*; do
if [[ "$(basename "$0")" != 'sh' ]]; then
# source only if not using sh
. "$f"
fi
done;
所以理论上,如果到sh
那时它被调用,它就不会尝试获取这些文件,但不确定这是否100%有效。