"Bash" কমান্ডটি 4.4 নয়, 3.2 সংস্করণে স্ক্রিপ্ট চালায়


2

বর্তমানে, টার্মিনালে আমার ডিফল্ট ইন্টারেক্টিভ শেলটি হ'ল বাশ সংস্করণ 4.৪। ৩.২ সহ ওএস জাহাজগুলি।

যদি আমি my_script.shবাশ সংস্করণ ৪.৪ ব্যবহার করে কোনও স্ক্রিপ্ট (যেমন, ) চালাতে চাই , তবে আমি এটি উত্স ( source my_script.sh) তৈরি করতে পারি বা এটি সরাসরি আমার টার্মিনালে টাইপ করতে পারি। যদিও, প্রতিটি ক্ষেত্রে স্ক্রিপ্টটি আমার বর্তমান শেলের মধ্যে চলে। আমি কোনও স্ক্রিপ্টও অনুমতি কার্যকর করতে এবং কমান্ড হিসাবে এটি চালাতে পারি, শেবাংকে কোন ধরণের সংস্করণ ব্যবহার করা উচিত তা নিয়ন্ত্রণ করার অনুমতি দেয়।

তবে, কমান্ডটি bash 3.2 সংস্করণ ব্যবহার করা অবিরত করে। উদাহরণস্বরূপ, যদি আমি চালনা করি bash my_script.shতবে স্ক্রিপ্টটি একটি নতুন শেলটিতে চালিত হবে (যা আমি চাই) তবে ব্যাশের পুরানো সংস্করণটি ব্যবহার করা হবে (3.2)। একইভাবে, যদি আমি কেবল bashকোনও যুক্তি ছাড়াই চলি, তবে সংস্করণ 3.2 ব্যবহার করে একটি নতুন শেল খোলে (মনে রাখবেন, আমি যদি টার্মিনালে একটি নতুন উইন্ডো বা ট্যাব খুলি, তবে এটি আমার ডিফল্ট শেল, বাশ v। 4.4 ব্যবহার করে here আমি কমান্ডটি ব্যবহার করি bash)।

আমি আমার মেশিনে 4.4 বাশ দেওয়ার পথটি আমার মেশিনে ( /usr/local/bin/bash) PATHপরিবর্তন করে দিয়েছি .bash_profileএবং এটি অন্য কোথাও ওভাররাইট করা হচ্ছে না ( echo $PATHপ্রত্যাশিত ফলাফল দেয়: একেবারে প্রথম পাথ usr/local/bin/bash)। আমি এটি কমান্ডের আচরণ পরিবর্তন করার প্রত্যাশা করেছিbash

আমি একটি উপনাম ( alias bash4='/usr/local/bin/bash') নির্ধারণ করে একটি কার্যকারিতা ব্যবহার করতে পারি, তবে আমাকে বাশ 3.2 এর জন্য বা একটি উথান ব্যবহার করতে হবে না, উদাহরণস্বরূপ, পাইথন বা আর।

আমি কি অনুপস্থিত কিছু আছে? ওরফে সমাধানটি কি এখানে একমাত্র বিকল্প?

সম্পাদনাগুলি

মন্তব্যের জবাবে:

SHELLএটিই /usr/local/bin/bashআমার ডিফল্ট লগইন শেল যেহেতু উদ্বেগজনক।

type -a bash মজাদার...

bash is /bin/bash
bash is /usr/local/bin/bash
bash is /bin/bash
bash is /usr/local/bin/bash
bash is /bin/bash
bash is /usr/local/bin/bash
bash is /bin/bash
bash is /usr/local/bin/bash

আমার পুরো পথটি একটি জগাখিচুড়ি, যা এই সমস্যার উত্স হতে পারে।

/usr/local/bin/bash:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/local/bin/bash:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/opt/X11/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/opt/X11/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Users/coltrane/Programming/Android_Development/sdk/platform-tools:/Library/Frameworks/R.framework/Resources/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/local/bin/bash:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/opt/X11/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Users/coltrane/Programming/Unix_Workbench/Code/Commands:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Library/TeX/texbin:/opt/X11/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Users/coltrane/Programming/Android_Development/sdk/platform-tools:/Library/Frameworks/R.framework/Resources/bin:/usr/local/git/bin:/Applications/anaconda/bin:/Users/coltrane/Programming/Android_Development/sdk/platform-tools:/Library/Frameworks/R.framework/Resources/bin

আমার পথের সাথে সম্পর্কিত নয় সমস্যা, আমার অজান্তেই $PATHআমার এক লাইনে পুনরায় পুনরায় পুনরায় পাঠ করা হয়েছিল .bash_profile, (PATH = AT PATH :: AT PATH) অনাকাঙ্ক্ষিত সদৃশ ঘটায়


ভিন্ন জিজ্ঞাসা করতে স্বাগতম :) অনুগ্রহ করে আউটপুট বা চলমান type -a bashএবং ভাগ করুন echo $SHELL
নিমেশ নীমা

এর আউটপুট পোস্ট করুন echo $PATH। ডিফল্ট ব্যাশটি পাওয়া যায় /bin/bashএবং আমি বাজি ধরছি এটি v4 বাশ যাওয়ার পথে আগে আসবে।
অ্যালান

@ অ্যালান না Us PATH- এ "বাশ" এর একমাত্র ব্যবহার হ'ল / ইউএসআর / স্থানীয় / বিন / ব্যাশ, যদিও এটি বহুবার পুনরাবৃত্তি করে ... সম্পাদনা ...
দে নভো

আমি ভুল টাইপ করেছি। বাশ পাওয়া যায় /bin। টাইপ করে এটি নিশ্চিত করুন which bash। তবে আমাদের এখনও আপনার পথ দেখতে হবে।
অ্যালান

@ অ্যালান আহ, হ্যাঁ, /binসেখানে একাধিকবার উপস্থিত ছিলেন এবং আমি বুঝতে পেরেছিলাম এটি সেখানেই থাকা উচিত। যদিও এটি সমাধান করার জন্য আমি খুব প্রথম দিকে 4.4 বাশ করার পথ রেখেছি।
দে নভো

উত্তর:


3

এখানে ত্রুটি যে প্রথম পাথ হয় PATHপরিবর্তে যে ডিরেক্টরি থেকে ব্যাশ এক্সিকিউটেবল ছিল, ধারণ করে ব্যাশ এক্সিকিউটেবল। অনুরূপ সমস্যাযুক্ত পাঠকদের জন্য: আপনার PATHভেরিয়েবলটিতে যে কোনও পথ যুক্ত করা হচ্ছে তা কোনও ফাইলের সাথে নয় ডিরেক্টরিতে সল্ভ হয়েছে তা নিশ্চিত করার জন্য ডাবল চেক করুন।

সমস্যা:

আমি আমার সাথে নিম্নলিখিতগুলি যুক্ত করেছিলাম .bash_profile:

PATH=/usr/local/bin/bash:$PATH

/usr/local/bin/bashএকটি ডিরেক্টরি নয়। এটি একটি ফাইল (ভাল, একটি ফাইলের একটি প্রতীকী লিঙ্ক)। সুতরাং, এটি একেবারে শুরুতে স্থাপন না করেই PATH, কমান্ডটি কোনও ডিরেক্টরিতে bashনামানো পর্যন্ত bashকোনও এক্সিকিউটেবল ফাইল খুঁজে পাবে না ।PATH/bin

সমাধান:

ইন .bash_profile, সেটিং

PATH=/usr/local/bin:$PATH

সমস্যা সমাধান করে। এখন কমান্ডটি এটির আগে এটি bashনির্বাহযোগ্যকে ভিতরে আবিষ্কার করে ।/usr/local/bin/bin


1

আপনি যদি আপনার ডিফল্ট শেল হিসাবে বাশ 4.4 ব্যবহার করতে চান তবে নিম্নলিখিতগুলি করুন:

  1. /bin/bashফাইলটির অন্য কোনও নামকরণ করুন ( bash3উদাহরণস্বরূপ)

    sudo mv /bin/bash /bin/bash3
  2. আপনার কাছ থেকে একটি সিমবলিক লিঙ্ক তৈরি /usr/local/bin/bashকরতে/bin/bash

    sudo ln -s /usr/local/bin/bash /bin/bash

এখন, আপনি যে কোনও সময় শেলটি খোলেন এটি বাশের 4.x সংস্করণটি খুলবে এবং যদি আপনার কখনও বাশ v3.x চালানোর দরকার হয় তবে কেবল অনুরোধ করুন bash3


কেবল স্পষ্ট করে বলতে গেলে, ব্যাশ 4.4 ইতিমধ্যে আমার ডিফল্ট শেল। যে কোনও সময় আমি শেল খুলি এটি ইতিমধ্যে ব্যাশের of.x সংস্করণটি খোলে। তবে আমি যখন আমার ডিফল্ট শেলটিতে থাকি, আমি প্রবেশ bashকরালে এটি ভার্সন ৩.২ ব্যবহার করে একটি নতুন শেল খোলে এবং সংস্করণ ৩.২ ব্যবহার করে একটি নতুন শেল bash my_script.shচালায় my_script.sh
দে নভো

bash 4.4আপনার ইন্টারেক্টিভ শেল। আপনার পাথের কারণে, যে কোনও সাবশেলগুলি 3.x হয় এই সমাধানটি আপনাকে প্রথমে 4.4 ব্যবহার করছেন তা নিশ্চিত করে।
অ্যালান

সাহায্যের জন্য ধন্যবাদ. দেখে মনে হচ্ছে আপনার সমাধানটি কাজ করবে (+1), তবে আমি শেষ পর্যন্ত আমাকে বিভ্রান্ত করতে পারে এমন কোনও লিঙ্ক যুক্ত করার পরিবর্তে আমার পথ ঠিক করার সিদ্ধান্ত নিয়েছিলাম। উপরের আমার প্রশ্নে আপনার মন্তব্যগুলি আমাকে প্রথম থেকেই যা দেখতে হবে তা স্বীকৃতি দিতে সহায়তা করেছিল: /usr/local/bin/bashকোনও ডিরেক্টরি নয়, সুতরাং এটি আমার PATHপরিবর্তনশীলটিতে যুক্ত করা অর্থহীন । এবং, ফাই, কোনও সাবশেলগুলি আগে 4.4 ছিল, এটি কেবলমাত্র সেই কমান্ডটি ব্যবহার bashকরছে যা প্রত্যাশা অনুযায়ী কাজ করে নি (আমার পথ ত্রুটির কারণে)।
দে নভো

আমি উপযুক্তভাবে যেমন আমার ডিফল্ট শেল সেট করেছে /usr/local/bin/bashযে কারণে শাঁস (এবং subshells) 4.4 ছিল, ব্যতীত যখন ব্যবহার bashকমান্ড।
দে নভো

1
এটি কি নিরাপদ? এটি এসআইপি-র সাথে আপেল বাইনারিগুলি সুরক্ষিত রাখে যা পুরানো হওয়া ছাড়াও - ওপি সমস্যার এক কারণ তৈরি করে - অ্যাপলকেও প্যাচ করে এবং knowsশ্বর জানেন যে অ্যাপল কীভাবে প্যাঁচে গেছে / প্যাচ করেছে। এর অর্থ এই দ্রুত এবং 'নোংরা' হ্যাকের ফলে সম্ভবত রাস্তায় বেশ অপ্রত্যাশিত সমস্যা দেখা দিতে পারে। অ্যাপল ব্যাশের জন্য প্যাচ সরবরাহ করে। তখন কি? বড় আপডেটগুলি ঘূর্ণায়মান, প্রায় কোনও কিছুই যথারীতি নথিভুক্ত হয় না, সিমলিংক ওভাররাইট হয়ে যায়। বাশ সংস্করণগুলি সন্দেহজনক উপায়ে পৃথক হতে পারে। আমি কেবল তখনই এটি বিবেচনা করব যদি সেকআপডেটস ব্যতীত অন্য কিছু না আসে, যেখানে প্যাশগুলি প্যাশগুলি সম্ভবত দুগ্ধ হয়।
ল্যাংল্যাংসি

0

আপনার সঠিক বিড করার জন্য স্ক্রিপ্টকে স্পষ্টভাবে নির্দেশনা দিচ্ছেন না কেন?

এটি দিয়ে শুরু করবেন না

#!/bin/sh 

বা আপনার শেবাং যাই হোক না কেন

তবে আপনার বাশ স্ক্রিপ্টের প্রথম লাইন হিসাবে চেষ্টা করুন

#!/usr/local/bin/bash 

সমস্যাগুলি যদি চালানোর চেষ্টা থেকে উদ্ভূত হয়

Bash my_script.sh কমান্ডের সাহায্যে কোনও বাশ স্ক্রিপ্ট কার্যকর করার সময়, শেবাংকে একটি মন্তব্য হিসাবে বিবেচনা করা হবে। আমি যদি আমার_স্ক্রিপ্টটি প্রদান করি তবে অনুমতিগুলি সম্পাদন করে এবং কমান্ড হিসাবে এটি চালিত হলে শেবাংটির ব্যাখ্যা কেবলমাত্র।

তারপরে নিখুঁত পথ ব্যবহার করে কোনও পরিষ্কার প্যাথ পরিবেশ ছাড়াই আপনার ইচ্ছাকে জোর করা সম্ভব (যদিও এটি এখনও পরিষ্কার করার প্রস্তাব দেওয়া হয়েছে):

কমান্ড দিয়ে একটি বাশ স্ক্রিপ্ট চালানোর সময় /usr/local/bin/bash my_script.sh

তবে এই ক্ষেত্রে সম্পূর্ণ পথ ব্যাশের কোনও উপাধি কার্যকর হতে পারে…


কমান্ডের সাহায্যে বাশ স্ক্রিপ্ট কার্যকর করার সময় bash my_script.sh, শেবাংকে একটি মন্তব্য হিসাবে বিবেচনা করা হবে। শেবাং কেবল তখনই ব্যাখ্যা করা হয় যদি আমি my_script.shনির্বাহের অনুমতি প্রদান করি এবং কমান্ড হিসাবে এটি চালিত করি।
ডি নোভো

1
ল্যাংল্যাং, এটি একটি সাধারণ নীতি আবার: যখন কোনও শেবাংকে একটি মন্তব্য হিসাবে বনাম হিসাবে বিবেচনা করা হয়, তবে আমার কোনও সমস্যা হচ্ছে না :), তবে হ্যাঁ, আমি পাথের পরিবর্তনশীল স্থির করার আগে সঠিক সংস্করণটির পরম পথটি কাজ করেছিল (এবং এটিকে আরও সুবিধাজনক করার জন্য ওরফে)
ডি নভো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.