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


11

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

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
おそらく/ bin / sh そのシステムのbashですか?
ジェフシャラー

1
それらのどれもお互いを調達しない、私はそれが悪い方法であることが難しい方法であることを発見しました。ただし、〜/ .profileは共有bashファイルを取得しているのでsh、.profileファイルのソースは何ですか?
Alexander Mills

1
共有ファイルのソースとなる〜/ .profileファイルを作成することに関する情報は、私にとって重要なようです。
ジェフシャラー

3
/ bin / shがbashであることは、bashにシンボリックリンクまたはハードリンクされている可能性があることを意味します。次に、bashはshをエミュレートしますが、〜/ .profileもソースにします。OSXパッケージのshとbashがどのように動作するのかわかりません。
ジェフシャラー

3
それらは同じbashソースから構築されてSTRICT_POSIXいます。
モスビー

回答:


20

このエラーはbash、POSIXシェルになりすましてこれらの関数を環境からインポートしようとしたときに発生します~/.bashrc。簡略化した例:

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

bashposixモードの場合、環境から関数をロードしないと予想していましたが、ロード、名前に面白い文字が含まれている場合にのみ文句を言います。

お知らせbash際にも、POSIXモードで実行されますPOSIXLY_CORRECTか、POSIX_PEDANTIC環境変数が設定されている、またはそれがコンパイルされたとき--enable-strict-posix-default/ STRICT_POSIX

この後者は/bin/shMacOS の場合(ここを見てくださいPRODUCT_NAME = sh)の場合のようですが、popen(3)またはのようなライブラリー関数を使用しているときにもこのエラーがトリガーされると思いsystem(3)ます。


3
修正:環境内の関数をエクスポートしないでください。Shellshockにつながった(または単にそうだった)bashのアンチ機能であり、削除されるべきでしたが、人々が愚かにそれを使用しているためではありませんでした。それらの1つにならないでください。
R .. GitHub ICEのヘルプを停止

bashインポートがそのまま呼び出されても機能するという事実shは、shellshock / bashdoorの脆弱性を大幅に悪化させたものです。
ステファンシャゼル

POSIXモードを有効にするその他の方法についてもSHELLOPTS=posix、また参照してください-o posix
ステファンシャゼル

また、set -a/ set -o allexportを指定すると、bashはすべての関数をエクスポートします(およびとして呼び出された場合はshPOSIXLY_CORRECT設定およびエクスポートされます!)
StéphaneChazelas '27

sh -a原因はPOSIXLY_CORRECT設定およびエクスポートされる。set -a後にshせずに-aエクスポートしない始めたPOSIXLY_CORRECTそれは前に設定されたため、-a有効でした)。
ステファンシャゼル

5

理由についての部分に答えるためにread.jsonts-projectポータブル関数名ではありませんが。

POSIXによると、関数定義がされなければならないという名前

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

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


しかし、POSIXは実装が関数の他の名前を受け入れることを禁じていないため、bashはPOSIXモードのときにこれらの制限を課す必要がありませんでした。関数名は、コマンド引数と同じ名前空間を共有し、これだけ受け入れるする理由はありません何かを(のようなzsh/ rc/ fish...)
ステファンChazelas

@StéphaneChazelas:知っていますが、POSIXモードになっているとはどういう意味ですか?
user2394284

@ user2394284確かにbash、それは、POSIXモードでは環境から関数をインポートしない、またはPOSIX仕様では必要ないという意味ではありません;-)
mosvy

@mosvy:ええ、それはbashが途中でどこかで失敗したことは明らかです–バグであるプレーンPOSIXシェルであると私は言うでしょう。
user2394284

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.