Sh (bash नहीं) मेरे .bashrc में परिभाषित कार्यों के बारे में शिकायत क्यों कर रहा है?


11

टर्मिनल सत्र खोलने पर मुझे यह मिल रहा है:

sh: `read.json 'के लिए फ़ंक्शन परिभाषा आयात करने में त्रुटि

sh: `ts-project 'के लिए फ़ंक्शन की परिभाषा आयात करने में त्रुटि

श को ये कार्य पसंद नहीं हैं क्योंकि वे जैसे दिखते हैं:

read.json(){
   ::
}

तथा

ts-project(){
   ::
}

असली सवाल यह है कि shइन फाइलों को क्यों स्पर्श / व्याख्या कर रहा है? मैं मैकओएस पर हूं और इसे पहले देखा था, यह एक ऐसा रहस्य है। मुझे लगता है कि केवल बैश ही इन फाइलों को लोड कर रहा होगा।

अद्यतन : बैश और श साधारण से बाहर कुछ भी नहीं हैं। जब मैं टर्मिनल में बैश करता हूं, मुझे यह मिलता है:

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 / श है कि सिस्टम पर बैश?
जेफ स्कालर

1
उनमें से कोई भी एक-दूसरे का स्रोत नहीं है, मुझे पता चला कि एक कठिन अभ्यास था। हालाँकि, ~ / .profile किसी साझा बैश फ़ाइल shको सोर्स कर रहा है , इसलिए हो सकता है कि .profile फ़ाइल के स्रोत क्या हों?
अलेक्जेंडर मिल्स

1
एक ~ / .profile फ़ाइल है जो साझा की गई फ़ाइल के स्रोत के बारे में जानकारी मुझे महत्वपूर्ण लगती है।
जेफ स्कालर

3
मैं / बिन / श दंश होने का मतलब यह है कि यह संभव है कि यह सहमी हुई हो या दंश के लिए कठोर हो। बैश तब शों का अनुकरण करता है, लेकिन साथ ही स्रोतों ~ / .profile भी। मैं अभी नहीं जानता कि कैसे OSX संकुल श और बाश।
जेफ स्कालर

3
वे एक ही bashस्रोत से निर्मित हैं , एक साथ STRICT_POSIX, दूसरा उसके बिना।
mosvy

जवाबों:


20

वह त्रुटि तब होती है जब bashPOSIX शेल के रूप में मास्किंग करना पर्यावरण से उन कार्यों को आयात करने की कोशिश करता है, न कि उन्हें लोड करते समय, जैसे कि फ़ाइल की व्याख्या करके ~/.bashrc। सरलीकृत उदाहरण:

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

मैं उम्मीद कर रहा था bashकि पॉज़िक्स मोड में होने पर पर्यावरण से फ़ंक्शंस लोड न करें, लेकिन यह करता है , और केवल तभी शिकायत करता है जब उनके नाम में अजीब अक्षर होते हैं।

ध्यान दें कि bashपॉसिक्स मोड में भी चलेगा जब POSIXLY_CORRECTया POSIX_PEDANTICपर्यावरण चर सेट किया जाता है, या जब यह --enable-strict-posix-default/ के साथ संकलित किया गया था STRICT_POSIX

यह उत्तरार्द्ध /bin/shMacOS के लिए मामला लगता है ( यहाँ के लिए देखो PRODUCT_NAME = sh), जहाँ मैं इस त्रुटि को भी ट्रिगर करने की उम्मीद करता हूं जैसे कि लाइब्रेरी फ़ंक्शन का उपयोग करते समय popen(3)या system(3)


3
तय: पर्यावरण में कार्यों का निर्यात नहीं करते। यह बैश एंटी-फीचर है जिसके कारण (या यों कहें, बस शेलशॉक था) और इसे हटा दिया जाना चाहिए था, लेकिन ऐसा इसलिए नहीं था क्योंकि लोग मूर्खता से इसका इस्तेमाल कर रहे थे। उनमें से एक मत बनो।
आर .. गिटहब स्टॉप हेल्पिंग ICE

तथ्य यह है कि बाश आयात करता है जब भी बुलाया जाता shहै जो गोले / बशर्ते भेद्यता बहुत बदतर बना दिया है।
स्टीफन चेज़लस 13

पॉज़िक्स मोड को सक्षम करने के अन्य तरीकों के लिए भी देखें SHELLOPTS=posixऔर देखें -o posix
स्टीफन चेज़लस 13

यह भी ध्यान दें कि set -a/ set -o allexportभी सभी कार्यों को निर्यात करने के लिए बैश का कारण बनता है (और अगर आह्वान किया जाता है sh, तो POSIXLY_CORRECTसेट होने और निर्यात करने का कारण बनता है!)
स्टीफन चेज़लस

( बिना सेट किए और निर्यात किए जाने का sh -aकारण बनता POSIXLY_CORRECTहै; बिना शुरू set -aहोने के बाद निर्यात नहीं होता क्योंकि यह पहले प्रभाव में था)। sh-aPOSIXLY_CORRECT-a
स्टीफन चेज़लस

5

पोर्टेबल फ़ंक्शन नाम क्यों read.jsonऔर क्यों ts-projectनहीं हैं, इस बारे में उत्तर देने के लिए :

POSIX के अनुसार, एक समारोह परिभाषा जाना चाहिए नामित द्वारा

पोर्टेबल वर्ण सेट से केवल अंडरस्कोर, अंक और वर्णमाला से मिलकर एक शब्द। नाम का पहला वर्ण कोई अंक नहीं है।

C लिंगो में एक पहचानकर्ता के रूप में भी जाना जाता है । या regex में:[_a-zA-Z][0-9_a-zA-Z]*


लेकिन POSIX कार्यों के लिए अन्य नामों को स्वीकार करने से कार्यान्वयन को मना नहीं करता है, इसलिए पॉश मोड में होने पर बैश को उन प्रतिबंधों को लागू करने की आवश्यकता नहीं थी । फ़ंक्शन नाम कमांड तर्कों के समान नामस्थान साझा करते हैं, इसलिए केवल कुछ भी स्वीकार करने का कोई कारण नहीं है (जैसे zsh/ rc/ fish...)
स्टीफन चेज़लस

@ स्टीफनचेज़ेलस: मुझे पता है, लेकिन "सभी एक्सटेंशन को शेड न करें", जैसे कि "चुपचाप उन्हें स्वीकार न करें" में इसका क्या मतलब है?
user2394284

@ user2394284 यह निश्चित रूप से इसका मतलब नहीं है कि bash, या यह POSIX मोड में रहते हुए पर्यावरण से कार्यों का आयात नहीं करेगा, जो कि POSIX कल्पना द्वारा आवश्यक नहीं है ;-)
mosvy

@ मॉसवी: हाँ, यह स्पष्ट है कि बैश रास्ते में कहीं विफल हो गया - मैं एक सादे पॉसिक्स शेल होने पर कहूंगा, जो एक बग होगा।
user2394284

0

तो क्या कारण है कि मैं अपनी ~ / .bashrc फ़ाइल में कुछ बैश स्क्रिप्ट सोर्स कर रहा हूँ जैसे:

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% समय पर नहीं होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.