ターミナルセッションを開くと、これが表示されます。
sh:「read.json」の関数定義のインポートエラー
sh:「ts-project」の関数定義のインポートエラー
shは次のように見えるため、これらの関数は好きではありません。
read.json(){
::
}
そして
ts-project(){
::
}
本当の質問は-なぜsh
はこれらのファイルに触れたり解釈したりするのですか?私はMacOSを使用していて、これを以前に見たことがあります。それはとても謎です。これらのファイルをロードするのはbashだけだと思います。
pdate: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$
このエラーは、_~/.bashrc
_などのファイルを解釈してロードするときではなく、POSIXシェルを装ったbash
が環境からこれらの関数をインポートしようとしたときに発生します。簡略化した例:
_foo.bar(){ true; }; export -f foo.bar; bash --posix -c true
bash: error importing function definition for `foo.bar'
_
私は、bash
がposixモードのときに環境から関数をロードしないことを期待していましたが、 実行し 、名前に変な文字が含まれている場合にのみ文句を言います。
_POSIXLY_CORRECT
_または_POSIX_PEDANTIC
_環境変数が設定されている場合、または_--enable-strict-posix-default
_/_STRICT_POSIX
_でコンパイルされた場合、bash
もposixモードで実行されることに注意してください。
この後者は、MacOSの_/bin/sh
_の場合のようです( こちら の_PRODUCT_NAME = sh
_を見てください)。 popen(3)
またはsystem(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%の時間で機能するかどうかはわかりません。