为什么 sh (不是 bash)抱怨我的 .bashrc 中定义的函数?

为什么 sh (不是 bash)抱怨我的 .bashrc 中定义的函数?

当我打开终端会话时,我得到了这个:

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_CORRECTPOSIX_PEDANTIC--enable-strict-posix-defaultSTRICT_POSIX

/bin/sh后者似乎是MacOS 上的情况(看看这里for ),我预计在使用orPRODUCT_NAME = sh等​​库函数时也会触发此错误。popen(3)system(3)

答案2

回答关于为什么read.jsonts-project不是可移植函数名称的部分:

根据 POSIX,一个函数定义必须是命名的经过

仅由可移植字符集中的下划线、数字和字母组成的单词。名称的第一个字符不是数字。

也称为标识符,用 C 语言来说。或者在正则表达式中:[_a-zA-Z][0-9_a-zA-Z]*

答案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%有效。

相关内容