web-dev-qa-db-ja.com

sh(bashではない)が.bashrcで定義された関数について不平を言うのはなぜですか?

ターミナルセッションを開くと、これが表示されます。

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$ 
11
Alexander Mills

このエラーは、_~/.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)などのライブラリ関数を使用するときにもトリガーされます。

20
mosvy

なぜread.jsonおよびts-projectは移植可能な関数名ではありません。

POSIXによると、 関数定義名前付き でなければなりません

ポータブル文字セットのアンダースコア、数字、アルファベットのみで構成されるWord。名前の最初の文字は数字ではありません。

C用語ではidentifierとも呼ばれます。または正規表現:[_a-zA-Z][0-9_a-zA-Z]*

5
user2394284

それで、それは私が〜/ .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%の時間で機能するかどうかはわかりません。

0
Alexander Mills