端末セッションを開くと、次の結果が表示されます。
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'
もともと私はbash
posixモードの環境で関数をロードしようとしませんでした。もちろん、名前に興味深い文字が含まれている場合にのみ文句を言います。
環境変数を設定またはコンパイルすると、bash
posixモードでも実行されることに注意してください。POSIXLY_CORRECT
POSIX_PEDANTIC
--enable-strict-posix-default
STRICT_POSIX
/bin/sh
後者はMacOSの場合のようです。ここPRODUCT_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%有効かどうかはわかりません。