বর্তমান শেলটি নির্ধারণ করার জন্য চেকবাশিজম-সম্মতিযুক্ত উপায়


18

আমার মধ্যে .profile, আমি নীচের কোডটি ব্যাশ-সম্পর্কিত সম্পর্কিত উপকরণগুলি এবং ফাংশনগুলি কেবলমাত্র যদি লগইন শেলটি আসলে বাশ হয় তবে তা উত্সাহিত হয় তা নিশ্চিত করতে ব্যবহার করি :

# If the current (login) shell is Bash, then
if [ "${BASH_VERSION:-}" ]; then
  # source ~/.bashrc if it exists.
  if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
  fi
fi

আমি বর্তমানে আমার শেল কনফিগারেশন ফাইল, স্ক্রিপ্ট এবং ফাংশনগুলি সংস্করণ নিয়ন্ত্রণে রাখার প্রক্রিয়ায় আছি। আমিও সম্প্রতি শেল স্ক্রিপ্ট ব্যাশ-নির্দিষ্ট বৈশিষ্ট্য থেকে উপকৃত হবে না, যেমন থেকে নৈমিত্তিক Bashisms সরানোর প্রতিস্থাপন প্রক্রিয়া শুরু করেছি function funcname()সঙ্গে funcname()

আমার শেল ফাইল সংগ্রহস্থলের, আমি একটি কনফিগার করেছেন প্রাক কমিট হুক যা রান checkbashismsডেবিয়ান এর থেকে উপযোগ devscripts প্যাকেজ প্রতিটি shসংগ্রহস্থলের মধ্যে ফাইল তা নিশ্চিত করার জন্য আমি অনবধানতাবশত ব্যাশ-নির্দিষ্ট সিনট্যাক্স পরিচয় করিয়ে না। তবে এটি আমার জন্য একটি ত্রুটি উত্থাপন করে .profile:

possible bashism in .profile line 51 ($BASH_SOMETHING):
if [ "${BASH_VERSION:-}" ]; then

আমি ভাবছিলাম যে কোন শেলটি চলছে তা যাচাই করার কোনও উপায় আছে যা কোনও সতর্কতা ট্রিগার করবে না checkbashisms

আমি POSIX দ্বারা তালিকাভুক্ত শেল সম্পর্কিত ভেরিয়েবলগুলির তালিকাটি পরীক্ষা করেছিলাম এই আশায় যে তাদের মধ্যে একটি বর্তমান শেল প্রদর্শন করতে পারে। আমি একটি ইন্টারেক্টিভ ড্যাশ শেলের মধ্যে সেট ভেরিয়েবলগুলিও দেখেছি কিন্তু, আবার কোনও উপযুক্ত প্রার্থী খুঁজে পেতে ব্যর্থ হয়েছি।

এই মুহুর্তে, আমি .profileপ্রক্রিয়াজাতকরণ থেকে বাদ পড়েছি checkbashisms; এটি একটি ছোট ফাইল তাই ম্যানুয়ালি এটি পরীক্ষা করা কঠিন নয়। তবে, বিষয়টি নিয়ে গবেষণা করে, আমি এখনও জানতে চাই কোন শেলটি চলছে কিনা তা নির্ধারণ করার জন্য (বা কমপক্ষে এমন কোনও উপায় যা checkbashismsব্যর্থ হওয়ার কারণ নেই ) কোনও পসিক্স অনুগত পদ্ধতি রয়েছে কিনা তা জানতে চাই ।


আরও পটভূমি / ব্যাখ্যা

আমি আমার শেল কনফিগারেশন ফাইলগুলিকে সংস্করণ নিয়ন্ত্রণের অধীনে রাখার একটি কারণ হ'ল আমি বর্তমানে নিয়মিত ভিত্তিতে লগ ইন করে থাকা সমস্ত সিস্টেমে আমার পরিবেশকে কনফিগার করা: সাইগউইন, উবুন্টু এবং সেন্টোস (উভয় 5 এবং 7) ব্যবহারকারীর জন্য অ্যাক্টিভ ডিরেক্টরি ব্যবহার করে প্রমাণীকরণ)। আমি প্রায়শই এক্স উইন্ডোজ / ডেস্কটপ পরিবেশ এবং দূরবর্তী হোস্টগুলির জন্য এসএসএইচ দিয়ে লগ ইন করি। তবে, আমি এটি ভবিষ্যতের প্রমাণ হতে চাই এবং যতটা সম্ভব সিস্টেম নির্ভরতা এবং অন্যান্য সরঞ্জামগুলির উপর নূন্যতম নির্ভরতা রাখি।

আমি checkbashismsআমার শেল-সম্পর্কিত ফাইলগুলির সিনট্যাক্সের জন্য একটি সাধারণ, স্বয়ংক্রিয় বিচক্ষণতা পরীক্ষা হিসাবে ব্যবহার করছি । এটি কোনও নিখুঁত সরঞ্জাম নয়, উদাহরণস্বরূপ, আমি ইতিমধ্যে এটিতে একটি প্যাচ প্রয়োগ করেছি যাতে এটি command -vআমার স্ক্রিপ্টগুলির ব্যবহার সম্পর্কে অভিযোগ না করে । গবেষণা করার সময়, আমি শিখেছি যে প্রোগ্রামটির আসল উদ্দেশ্য হ'ল ডেবিয়ান নীতিমালার সাথে সম্মতি নিশ্চিত করা যা আমি বুঝতে পেরেছি যে ২০০OS (বা এর ২০১৩ এর পুনর্বিবেচনা) এর চেয়ে পোসিক্স 2004 এর উপর ভিত্তি করে is


পুরো পয়েন্টটি আলাদাভাবে বিভিন্ন পসিক্স-কমপ্লায়েন্ট এনভায়রনমেন্টে আলাদাভাবে চালানো হলে আপনি যা করছেন তা পসিক্স-কমপ্লায়েন্টের মতো কিছু হতে পারে। আপনার গরুর মাংস চেকব্যাশিজম সহ।
গিলস 23'13

এবং যেভাবে আমি কখনও আমার কনফিগারেশনের বহনযোগ্যতা পরীক্ষা করতে চেকব্যাশিজম ব্যবহার করি নি। আমি এটি বিভিন্ন সিস্টেমে ব্যবহার করে এটি চেক করি।
গিলস 23'14

2
এবং যাইহোক, আপনি এখানে যে নির্দিষ্ট কাজটি করছেন তার জন্য একটি .bash_profileউত্স .profileএবং উভয় শর্তাধীন লিখুন .bashrc
গিলস 23'17 এ 'দুষ্ট হওয়া বন্ধ করুন'

প্রতিক্রিয়া জন্য ধন্যবাদ গিলস। এটি নির্দিষ্ট ইস্যুটির জন্য খুব মার্জিত সমাধান।
অ্যান্টনি জি -

উত্তর:


16

তোমার

# If the current (login) shell is Bash, then
if [ "${BASH_VERSION:-}" ]; then
  # source ~/.bashrc if it exists.
  if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
  fi
fi

কোডটি পুরোপুরি পসিক্স উপযোগী এবং আপনি বর্তমানে চলছে তা যাচাই করার সেরা উপায় bash। অবশ্যই $BASH_VERSIONভেরিয়েবলটি ব্যাশ-নির্দিষ্ট, তবে বিশেষত আপনি এটি ব্যবহার করছেন! আপনি যাচ্ছেন তা যাচাই করতে bash!

লক্ষ্য করুন $BASH_VERSIONকিনা সেট করা হবে bashযেন বরকত হয় bashবা sh। একবার আপনি দৃ running়ভাবে চালিত হয়ে গেছেন যে আপনি চলছেন bash, আপনি [ -o posix ]শেল হিসাবে চিহ্নিত করা হয়েছে এমন একটি সূচক হিসাবে ব্যবহার করতে পারেন sh(যদিও পসিক্সএলওয়াইসিআরইসিটি পরিবেশে থাকে বা bashতার সাথে ডাকা হয় -o posix, বা পরিবেশে শেলপপস = পিক্সিক সহ সেই বিকল্পটি সেট করা থাকে। তবে এই সমস্ত ক্ষেত্রে, bashযেমন হিসাবে ডাকা হবে তেমন আচরণ করবে sh)।


আপনি পরিবর্তে অন্য একটি পরিবর্তনশীল ব্যবহার করতে পারেন $BASH_VERSIONএবং বিকল্পটি checkbashismপাস না করা হলে এটি অভিযোগ করবে বলে মনে হয় না । এটি সুনির্দিষ্ট যার সাথে আপনি চালাচ্ছেন কি না তা নির্ধারণ করতে আপনারও সক্ষম হওয়া উচিত ।-x$BASHbashbash


আমি এটি যুক্তি দিয়ে বলি যে এটি সত্যিকারের যথাযথ ব্যবহার নয় checkbashismscheckbashismsপোর্টেবল shস্ক্রিপ্টগুলি লিখতে আপনাকে সহায়তা করার একটি হাতিয়ার ( shদেবিয়ান নীতিতে স্পেসিফিকেশন অনুসারে, যা একটি পসিক্সের সুপারস্টেট), এটি shএমন একটি সিস্টেমে সিঙ্ক লিঙ্ক রয়েছে এমন সিস্টেমে লোকেরা স্ক্রিপ্ট লেখার দ্বারা প্রবর্তিত অ-মানক সিনট্যাক্স সনাক্ত করতে সহায়তা করে bash

একটি .profileভিন্ন শাঁস, যার অনেকগুলোই POSIX অনুবর্তী নয় দ্বারা ব্যাখ্যা করা হয়। সাধারণত, আপনি ব্যবহার না shআপনার লগইন শেল হিসাবে কিন্তু শাঁস পছন্দ zsh, fishবা bashআরও উন্নত বৈশিষ্ট্যের ইন্টারেক্টিভ সঙ্গে।

bashএবং যখন তাদের zshহিসাবে পরিচিত না হয় shএবং যখন তাদের সম্পর্কিত প্রোফাইল সেশন ফাইল ( .bash_profile, .zprofile) পসিক্স কনফরম্যান্ট নয় (বিশেষত zsh) তবে এখনও পড়ে থাকে .profile

সুতরাং এটি আপনি চান পসিক্স সিনট্যাক্স নয় .profileতবে একটি সিনট্যাক্স যা পসিক্সের সাথে সামঞ্জস্যপূর্ণ (এর জন্য sh), bashএবং zshযদি আপনি কখনও সে শেল ব্যবহার করেন (সম্ভবত বোর্ন বোর্নও পড়তে পারে .profileতবে লিনাক্স ভিত্তিক সিস্টেমে সাধারণত পাওয়া যায় না )।

checkbashismsবাশিজমগুলি সন্ধান করতে আপনাকে অবশ্যই সহায়তা করবে তবে POSIX সিনট্যাক্সটি zshবা এটির সাথে সামঞ্জস্যপূর্ণ নয় এমনটি চিহ্নিত করতে পারে না bash

এখানে, আপনি যদি bashস্পেসিফিক কোড ব্যবহার করতে চান (যেমন bashবাগের চারপাশের কাজের মতো এটি ~/.bashrcইন্টারেক্টিভ লগইন শেলগুলিতে পড়ে না) তবে আরও ভাল পন্থাটি হ'ল (সোর্সিংয়ের ~/.bash_profileআগে বা পরে ~/.profileযেখানে আপনি আপনার সাধারণ অধিবেশনটি রেখেছেন সেখানে) initialisations)।


checkbashismsভেরিয়েবল ব্যবহারের কারণে এটি পাস হয় না ।
টমাস ডিকি

2
@ থমাসডিকি, হ্যাঁ তবে এটি এমন একটি ঘটনা যেখানে চেকব্যাশিজমের প্রতিবেদন উপেক্ষা করা উচিত। এখনও অবধি দেওয়া অন্যান্য সমস্ত সমাধান যথেষ্ট খারাপ।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস আপনি বলছেন যে অন্যান্য সমস্ত সমাধান আরও খারাপ। $0এই বিশেষ ক্ষেত্রে ব্যবহার করে কী ভুল হবে ?
অ্যান্টনি জি -

2
@ অ্যান্থনি জিওগেন যেটিকে বাশ নামে ডাকা shএবং কিছু অন্য শেলের মধ্যে পার্থক্য করে না sh
গিলস 23'16

এটি dashবা অন্য কোনও ন্যাশ-ব্যাশ শেলকে ভুলভাবে ডেকে আনা হলে এটি একটি মিথ্যা ইতিবাচক বিষয়ও দেয় argv[0] == "bash"যা পুরোপুরি আইনী, যদি অসম্ভব হয় তবে।
কেভিন

17

সাধারণত $0এই উদ্দেশ্যে একটি ব্যবহার করে । আপনি যে সাইটের সাথে এটি সংযুক্ত করেছেন সেখানে দাঁড়িয়ে আছে:

0
   (Zero.) Expands to the name of the shell or shell script.

খুবই সোজা! আমি $0শেল স্ক্রিপ্টের নামের জন্য এতটা অভ্যস্ত হয়ে গিয়েছি যে আমি পরিষ্কার করে ভুলে গেছি যে এটি বর্তমান শেলটিকেও উল্লেখ করতে পারে। ধন্যবাদ!
অ্যান্টনি জি -

1
যথারীতি, এই কনভেনশনটি সমস্ত ভাল আচরণিত প্রোগ্রামের দ্বারা সম্মানিত হয় তবে একটি দূষিত প্রোগ্রাম execপরিবার থেকে বিভিন্ন সিস্টেম কল ব্যবহার করে আপনার সাথে ঝামেলা করতে পারে কারণ তারা কলিং প্রোগ্রামটিকে বাইনারি শনাক্ত করার জন্য স্ট্রিং থেকে পৃথকভাবে চালিত হতে পারে যুক্তি হিসাবে পাস করার জন্য 0.
dmckee

এটি প্রোফাইলে :) চতুর জন্য কাজ করে
রব

5

সাধারণত শেল পরিবেশ পরিবর্তনশীল আপনাকে ডিফল্ট শেলটি বলে। আপনাকে নিজেই .bashrc ফাইলটি উত্সের প্রয়োজন হবে না (সত্য দেখুন আপডেট বেলো নয়), বাশকে স্বয়ংক্রিয়ভাবে এটি করা উচিত এটি কেবলমাত্র $ HOM ডিরেক্টরিতে রয়েছে তা নিশ্চিত করে নিন।

অন্য বিকল্পটি হ'ল কিছু করা:

 ps -o cmd= $$

এটি আপনাকে বর্তমান প্রক্রিয়াটির কমান্ডটি (তর্ক ছাড়াই, = মান ব্যতীত কলাম শিরোনাম প্রদর্শন করবে না) জানাবে। উদাহরণ আউটপুট:

 $ps -o cmd= $$
 bash
 $sh
 $ps -o cmd= $$
 sh

হালনাগাদ:

আমি সংশোধন করেছি! :)

মন্তব্যগুলিতে নমুনা এবং /programming/415403/whats-the-differences-between-bashrc-bash-profile-and- ्यावर পরিবেশে উল্লিখিত হিসাবে .bashrc সর্বদা উত্সাহিত হয় না

সুতরাং আপনি আপনার .bashrc .bash_profile এ সরিয়ে নিতে পারেন এবং পরীক্ষা না করেই এটি কাজ করে কিনা তা দেখতে পারেন। যদি না হয় আপনার উপরে পরীক্ষা আছে।


1
.bashrcআসলে লগইন শেল দ্বারা উত্সাহিত হয় না তবে .profile(এটি উপস্থিত থাকলে) বা .bash_profileহয়। SHELLPOSIX দ্বারা এবং দুর্ভাগ্যবশত নির্দিষ্ট করা না থাকে, তন্ন তন্ন হয় cmdজন্য বিন্যাস বিকল্প ps
অ্যান্টনি জি -

1
এটি আমি ব্যবহার করব তবে এটি দূষিত কারসাজিরও বিষয়।
ডিএমকেেকে

মনে রাখবেন যে ps -o cmd= $$সর্বত্র বেশ কার্যকরভাবে কাজ করা উচিত, $SHELLচলক সম্পূর্ণ অপ্রাসঙ্গিক। এটি ব্যবহারকারীর ডিফল্ট শেল এবং বর্তমানে কোন শেল চালিত হচ্ছে বা শেল কোন শেল স্ক্রিপ্ট চালাচ্ছে তার কোনও ফলসই নেই।
টেরডন

2
আসলেই না, না। ~/.profileলগইন শেল হিসাবে শুরু করার সাথে অনেক শেল পড়বে । সুতরাং, উদাহরণস্বরূপ, আপনার $SHELLহতে পারে cshএবং আপনি চালানো bash -l। এটি লগইন শেল হিসাবে বাশ শুরু করবে, তাই এটি পড়বে ~/.profile, তবে আপনার $SHELLএখনও নির্দেশ করবে csh। এছাড়াও, .profileঅন্য স্ক্রিপ্ট দ্বারা স্পষ্টভাবে উত্সাহিত করা যেতে পারে। যেহেতু ওপি সর্বোচ্চ দৃust়তার জন্য যাচ্ছে, তাই সব ধরণের ক্ষেত্রে বিবেচনা করা উচিত। যাই হোক, $SHELLবর্তমানে চলমান শেল সম্পর্কে কোনো দরকারী তথ্য প্রদান করে না।
টেরডন

2
এফডব্লিউআইডাব্লু, আমিও সংশোধন করে দাঁড়িয়েছি - পসআইএক্সSHELL দ্বারা নির্দিষ্ট না করা সম্পর্কে : পাবস.ওপেনগ্রুপ.আর
অ্যান্টনি জি - মনিকার জন্য ন্যায়বিচার

4

প্রশ্নটি ব্যবহারকারীর লগইন শেলের পাশাপাশি বর্তমান শেলটি এমনভাবে উপস্থাপিত করে যা সন্তুষ্ট হয় checkbashisms। যদি এটি শেল বোঝানো হয় যার উপর ব্যবহারকারী লগইন করে থাকে তবে আমি একটিটি ব্যবহার করব /etc/passwd, উদাহরণস্বরূপ,

MY_UID=$(id -u)
MYSHELL=$(awk -F: '$3 == '$MY_UID'{ print $7; }' </etc/passwd )

ব্যবহারকারীগণ অবশ্যই লগ ইন করার পরে একটি নতুন শেল শুরু করতে পারেন one অবশ্যই, যদি একটি ব্যাশ হয় এবং অন্যটি না হয় তবে ব্যাশের পরিবেশের ভেরিয়েবলগুলির পরীক্ষাগুলি সাহায্য করতে পারে না।

কেউ কেউ getentকেবল passwdফাইলের পরিবর্তে ব্যবহার করতে চাইতে পারেন (তবে এটি প্রশ্নের ক্ষেত্রের মধ্যে হবে না)।

এলডিএপি সম্পর্কে মন্তব্য এবং এর পরামর্শের ভিত্তিতে lognameএই বিকল্প ফর্মটি ব্যবহার করা যেতে পারে:

MY_NAME=$(logname)
MYSHELL=$(getent passwd | awk -F: '$1 ~ /^'$MY_NAME'$/ {print $7;}' )

এটি পরীক্ষা করার সময় আমি লক্ষ্য করেছি যে lognameএর ইনপুটটি পুনঃনির্দেশিত করা পছন্দ করে না (তাই আমি প্রকাশটি আলাদা করে রেখেছি)। একটি দ্রুত চেক শোতে getentউল্লিখিত প্ল্যাটফর্মগুলিতে কাজ করা উচিত (যদিও এটি মূল প্রশ্নে সরবরাহ করা উচিত ছিল):


1
ধরে নিই যে ব্যবহারকারীর ডাটাবেসটি / ইত্যাদি / পাসডাব্লুডে রয়েছে (এলডিএপি / এনআইএস / মাইএসকিএল নয় ...) এবং প্রতি ইউজারিডে কেবলমাত্র একজনের নাম রয়েছে। (এর বিরুদ্ধে প্রথম কলামটি পরীক্ষা করা ভাল $(logname))।
স্টাফেন চেজেলাস

তবে, পসিক্স প্রয়োজনীয় ইউটিলিটিটি সংজ্ঞায়িত করে না (বা আমি আমার উত্তরে এটি ব্যবহার করতাম)। idব্যবহারকারী বা পরিবর্তিত পরিবর্তনশীল ব্যবহার করতে হবে বা না তা পৃথক পছন্দ।
টমাস ডিকি

1
আমি বলেছি নোট $(logname), না $LOGNAME। ব্যবহারকারী আইডি এবং লগইন শেল উভয়ই লগইনে ব্যবহৃত ব্যবহারকারীর নাম থেকে প্রাপ্ত। আপনি ব্যবহারকারী আইডি থেকে লগইন শেলটিতে ফিরে আসতে পারবেন না কেবল এমন সিস্টেম ব্যতীত যেখানে প্রতি ব্যবহারকারী আইডিতে কেবল একজনের নাম রয়েছে। বা আইডাব্লু, ব্যবহারকারী ডাটাবেসের প্রাথমিক কী হ'ল ইউজারনেম, ইউআইডি নয়।
স্টাফেন শেজেলাস

একটি ভিন্ন দৃষ্টিকোণ থেকে আসা উত্তর জন্য থমাসডিকি ধন্যবাদ! যাইহোক, এটা একটু বেশী জটিল কি আমি চিন্তা ছিল (আরও মত jimmij 's এবং Stéphane এর উত্তর)। আমি আমার শেল কনফিগারেশন ফাইলগুলিকে সংস্করণ নিয়ন্ত্রণের অধীনে রাখার একটি কারণ হ'ল আমি বর্তমানে নিয়মিত ভিত্তিতে লগ ইন করে থাকা সমস্ত সিস্টেমে আমার পরিবেশকে কনফিগার করা: সাইগউইন, উবুন্টু এবং সেন্টোস (উভয় 5 এবং 7) ব্যবহারকারীর জন্য অ্যাক্টিভ ডিরেক্টরি ব্যবহার করে প্রমাণীকরণ)। যে কারণে আমি যুক্তিটি যথাসম্ভব সরল রাখতে পছন্দ করি।
অ্যান্টনি জি -
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.