bashではなくshが.bashrcで定義された関数について文句を言うのはなぜですか?

bashではなくshが.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シェルが環境からインポートしようとするとエラーが発生します~/.bashrc。単純化された例:

foo.bar(){ true; }; export -f foo.bar; bash --posix -c true
bash: error importing function definition for `foo.bar'

もともと私はbashposixモードの環境で関数をロードしようとしませんでした。もちろん、名前に興味深い文字が含まれている場合にのみ文句を言います。

環境変数を設定またはコンパイルすると、bashposixモードでも実行されることに注意してください。POSIXLY_CORRECTPOSIX_PEDANTIC--enable-strict-posix-defaultSTRICT_POSIX

/bin/sh後者はMacOSの場合のようです。ここPRODUCT_NAME = sh)の場合、または同じライブラリ関数を使用してもこのエラーが発生すると予想されます。popen(3)system(3)

答え2

移植可能な関数名ではないread.json理由の一部に答えるには、次のようにします。ts-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%有効かどうかはわかりません。

関連情報