Sh (বাশ নয়) আমার .bashrc- এ সংজ্ঞায়িত ফাংশন সম্পর্কে অভিযোগ করছেন কেন?


11

আমি যখন টার্মিনাল সেশনটি খুলি তখন আমি এটি পেয়ে যাচ্ছি:

sh: 'read.json' এর জন্য ফাংশন সংজ্ঞা আমদানিতে ত্রুটি

sh: `ts- প্রকল্পের জন্য ফাংশন সংজ্ঞা আমদানি করার সময় ত্রুটি

sh এই ফাংশনগুলি পছন্দ করে না কারণ তারা দেখতে তাদের মতো:

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
সম্ভবত / বিন / SH হয় যে সিস্টেমে ব্যাশ?
জেফ স্ক্যালার হলেন

1
তাদের মধ্যে কেউই একে অপরকে উত্স দেয় না, আমি আবিষ্কার করেছি যে এটি একটি শক্ত অভ্যাস ছিল way যাইহোক, of /। প্রোফাইলে একটি ভাগ করা বাশ ফাইলটি সোসারি করছে, তাই সম্ভবত প্রোফাইলে ফাইলটি shকী উত্স?
আলেকজান্ডার মিলস

1
একটি। /। প্রোফাইল ফাইল থাকার তথ্য যা ভাগ করে নেওয়া ফাইলটি আমার কাছে গুরুত্বপূর্ণ বলে মনে করে।
জেফ স্ক্যালার হলেন

3
আমি কীভাবে / বিন / শকে বাশ বলতে চেয়েছি তা হ'ল এটি সম্ভবত যুক্ত বা সংযুক্ত বা কড়া যুক্ত করা সম্ভব to এরপরে বাশ শের অনুকরণ করে তবে সূত্র ~ /। প্রোফাইল। আমি কেবল জানি না কীভাবে ওএসএক্স প্যাকেজগুলি sh এবং bash করে।
জেফ স্ক্যালার হলেন

3
এগুলি একই bashউত্স থেকে তৈরি , যার সাথে একটি STRICT_POSIX, অন্যটি ছাড়া।
মোশি

উত্তর:


20

bashপসিক্স শেল হিসাবে মাস্ক্রেড করার সময় এই ত্রুটিটি ঘটে থাকে যখন পরিবেশ থেকে এই ফাংশনগুলি আমদানি করার চেষ্টা করে, যখন এ জাতীয় ~/.bashrcবা এর মতো কোনও ফাইলের ব্যাখ্যা দিয়ে লোড করার সময় নয় । সরলীকৃত উদাহরণ:

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

আমি প্রত্যাশা করছিলাম bashযখন পিক্সিক্স মোডে পরিবেশ থেকে ফাংশনগুলি লোড না করা হবে তবে এটি ঘটে এবং কেবল তাদের অভিযোগের মধ্যে মজার চরিত্রগুলি থাকে তখনই অভিযোগ করে।

লক্ষ করুন যে, bashযখন posix মোডে চালানো হবে POSIXLY_CORRECTবা POSIX_PEDANTICএনভায়রনমেন্ট ভেরিয়েবল সেট করা হয়, অথবা যখন এটি দিয়ে কম্পাইল করা হয়েছে --enable-strict-posix-default/ STRICT_POSIX

এই আধুনিক কেনার ক্ষেত্রে দেখা হবে বলে মনে হয় /bin/shMacOS এর উপর (বর্ণন এখানে জন্য PRODUCT_NAME = sh), যেখানে আমি মত গ্রন্থাগার ফাংশন ব্যবহার করে এছাড়াও ট্রিগার এই ত্রুটি আশা popen(3)বা system(3)


3
সমাধান: পরিবেশে ফাংশন রফতানি করবেন না। এটি বাশবিরোধী বৈশিষ্ট্য যা শেলশকের দিকে পরিচালিত করে (বা বরং কেবল এটি ছিল) শেলশক এবং এটি সরানো উচিত ছিল, তবে এটি লোকে মূর্খতার সাথে ব্যবহার করার কারণে নয়। তাদের একজন হবেন না।
আর .. গীটহাব বন্ধ করুন ICE

সত্য যে ব্যাশ আমদানির ফাংশন এমনকি যখন বলা shকি একটি ShellShock / bashdoor দুর্বলতার তৈরি অনেক খারাপ।
স্টাফেন চেজেলাস

পোস্টিক্স মোড সক্ষম করার জন্য SHELLOPTS=posixএবং -o posixঅন্যান্য উপায়গুলির জন্যও দেখুন ।
স্টাফেন চেজেলাস

এছাড়াও মনে রাখবেন set -a/ set -o allexportএছাড়াও সব ফাংশন রপ্তানি করতে ব্যাশ ঘটায় (এবং যদি যেন বরকত sh, কারণ POSIXLY_CORRECTসেট এবং রপ্তানি করা!)
Stéphane Chazelas

( সেট করে রফতানি করার sh -aকারণগুলি POSIXLY_CORRECT; বাইরে শুরু set -aহওয়ার পরে রফতানি হয় না কারণ এটি কার্যকর হওয়ার আগে সেট করা হয়েছিল)। sh-aPOSIXLY_CORRECT-a
Stéphane Chazelas

5

কেন পোর্টেবল ফাংশন নাম read.jsonএবং ts-projectনা সে সম্পর্কে অংশটির উত্তর দিতে :

পসিক্সের মতে একটি ফাংশন সংজ্ঞা দ্বারা নামকরণ করা আবশ্যক

বহনযোগ্য অক্ষর সেট থেকে আন্ডারস্কোর, অঙ্ক এবং বর্ণমালা সমন্বিত একটি শব্দ। নামের প্রথম অক্ষরটি কোনও অঙ্ক নয়।

সি লিংগোতে সনাক্তকারী হিসাবেও পরিচিত । বা রেজেক্সে:[_a-zA-Z][0-9_a-zA-Z]*


তবে পসিএক্স কার্যবিধির জন্য অন্য নামগুলি গ্রহণের ক্ষেত্রে প্রয়োগগুলি নিষিদ্ধ করে না, সুতরাং পসিক্স মোডে থাকাকালীন বাশকে এই বিধিনিষেধ আরোপ করতে হবে না । ফাংশন নাম কমান্ড আর্গুমেন্ট হিসাবে একই নাম স্থান ভাগ করে নেবে, সুতরাং ঠিক কিছু গ্রহণ করার কারণ নেই (যেমন zsh/ rc/ fish...)
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস: আমি জানি, তবে "নিঃশব্দে সেগুলি গ্রহণ না করে" যেমন "সমস্ত এক্সটেনশানগুলি চালিত না" হয় তবে পসিক্স মোডে থাকার অর্থ কী?
ব্যবহারকারী 2394284

@ user2394284 এটা অবশ্যই অর্থ এই নয় যে এ bash, অথবা এটি would পরিবেশ থেকে আমদানি না ফাংশন POSIX মোড, যার দ্বারা POSIX বৈশিষ্ট ;-) প্রয়োজন হয় না যখন
mosvy

@ মোসভি: হ্যাঁ, এটা স্পষ্ট যে বাশ কোথাও কোথাও ব্যর্থ হয়েছিল - আমি বলতে চাই যে একটি সরল পসিক্স শেল, যা একটি বাগ হবে।
ব্যবহারকারী 2394284

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% কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.