প্রারম্ভকালে বাশ দ্বারা কী স্ক্রিপ্টগুলি চালিত হচ্ছে তা সন্ধান করুন


15

ব্যাশ টার্মিনাল শুরু করার পরে, আমি লক্ষ করেছি যে PATH ভেরিয়েবলটিতে নকল এন্ট্রি রয়েছে। আমার টার্মিনালটি একটি লগইন শেল শুরু করে , তাই ~/.bash_profileউত্সাহিত হয়, এরপরে ~/.profileএবং পরে ~/.bashrc~/.profileআমি কেবল সেই পথে প্রবেশের প্রবেশগুলি তৈরি করি যা সদৃশ are

পেডেন্টিক হওয়ার জন্য, এই ক্রমটি যাতে সেই ফাইলগুলিকে সস করা উচিত তা হ'ল:

Sourced /etc/profile
Sourced /etc/bash.bashrc
Sourced .bash_profile
Sourced .profile
Sourced .bashrc

"PATH ভেরিয়েবলের ডুপ্লিকেট রয়েছে" এর সদৃশ হিসাবে এটি চিহ্নিত করার আগে, পড়া চালিয়ে যান।

প্রথমে আমি ভেবেছিলাম যে এটি ~/.profileদু'বার সস হওয়ার সাথে সাথে করা উচিত , সুতরাং যখনই এটি উত্সাহিত হয়েছিল তখন আমার কাছে একটি লগ ফাইলটিতে লেখা ছিল, এবং আশ্চর্যরকমভাবে এটি কেবল একটি এন্ট্রি লগ করেছিল, যা আমাকে বলে যে এটি একবারে উত্সাহিত হয়েছিল। আরও আশ্চর্যের বিষয়টি হ'ল আমি যখন প্রবেশ করা মন্তব্যগুলিতে মন্তব্য করি তখন ~/.profileএন্ট্রিগুলি PATHভেরিয়েবলের মধ্যে উপস্থিত থাকে । এটি আমাকে তিনটি সিদ্ধান্তে নিয়ে গেছে, যার মধ্যে একটি দ্রুত বাতিল হয়েছিল:

  1. বাশ বৈধ বাশ মন্তব্য উপেক্ষা করে এবং এখনও মন্তব্য করা কোডটি কার্যকর করে
  2. এখানে একটি স্ক্রিপ্ট রয়েছে যা ~/.profileকোনও আউটপুট মুদ্রণ করে এমন কোনও কোড উপেক্ষা করে এবং উপেক্ষা করে (উদাহরণস্বরূপ লগ ফাইল)
  3. আমার অন্য একটি অনুলিপি ~/.profileযা অন্যত্র সস করা হচ্ছে

প্রথমটি, আমি দ্রুত সিদ্ধান্ত নিয়েছি কিছু দ্রুত পরীক্ষার কারণে কেসটি না হয়। দ্বিতীয় এবং তৃতীয় বিকল্পগুলি যেখানে আমার সাহায্য দরকার।

আমার টার্মিনাল শুরু হওয়ার সাথে সাথে আমি কীভাবে স্ক্রিপ্টগুলির লগ সংগ্রহ করব? আমি echoফাইলগুলিতে ব্যাশ দ্বারা উত্সাহিত কিনা তা জানতে পরীক্ষা করেছিলাম, তবে টার্মিনালটি টাইপ করার জন্য টার্মিনাল প্রস্তুত হওয়ার জন্য আমার একটি নির্ধারিত পদ্ধতি আবিষ্কার করতে হবে যা কার্যকরভাবে চিহ্নিত করতে পারে।

যদি উপরেরটি সম্ভব না হয়, তবে যে কেউ স্ক্রিপ্টগুলি চালিত হচ্ছে তা দেখার জন্য আমি অন্য কোথাও পরামর্শ দিতে পারি


ভবিষ্যতে উল্লেখের

আমি এখন আমার পথে যোগ করার জন্য এই স্ক্রিপ্টটি ব্যবহার করছি:

function add_to_path() {
    for path in ${2//:/ }; do
        if ! [[ "${!1}" =~ "${path%/}" ]]; then # ignore last /
            new_path="$path:${!1#:}"
            export "$1"="${new_path%:}" # remove trailing :
        fi
    done
}

আমি এটি এর মতো ব্যবহার করি:

add_to_path 'PATH' "/some/path/bin"

স্ক্রিপ্টটি পরীক্ষা করার আগে পথটি ইতিমধ্যে চলকটিতে বিদ্যমান কিনা তা পরীক্ষা করে।

Zsh ব্যবহারকারীদের জন্য, আপনি এই সমতুল্য ব্যবহার করতে পারেন:

function add_to_path() {
    for p in ${(s.:.)2}; do
        if [[ ! "${(P)1}" =~ "${p%/}" ]]; then
            new_path="$p:${(P)1#:}"
            export "$1"="${new_path%:}"
        fi
    done
}

28/8/2018 সম্পাদনা করুন

এই স্ক্রিপ্টটির সাথে আমি আরও একটি জিনিস খুঁজে পেতে পারি তা হ'ল পথটি ঠিক করা। সুতরাং আমার .bashrcফাইলের শুরুতে , আমি এই জাতীয় কিছু করি:

_temp_path="$PATH"
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin'
add_to_path 'PATH' "$_temp_path"
unset _temp_path

এটি কী আপনার PATHসাথে শুরু করা উচিত। PATHসিদ্ধান্ত নেওয়ার জন্য প্রথমে পরীক্ষা করুন ।


ব্যাশ শুধুমাত্র সার্চ থেকে ~/.profile যদি ~/.bash_profileকোন অস্তিত্ব নেই ...
jasonwryan

@jasonwryan, আমি উৎস ~/.profileএবং ~/.bashrcথেকে~/.bash_profile
smac89

উত্তর:


30

যদি আপনার সিস্টেমে থাকে straceতবে আপনি শেল দ্বারা খোলা ফাইলগুলি তালিকাভুক্ত করতে পারেন, উদাহরণস্বরূপ ব্যবহার করে

echo exit | strace bash -li |& grep '^open'

( -liমানে লগইন শেল ইন্টারেক্টিভ; কেবল -iএকটি ইন্টারেক্টিভ অ-লগইন শেল ব্যবহার করুন))

এটি ফাইলগুলির একটি তালিকা প্রদর্শন করবে যা শেলটি খোলার বা খোলার চেষ্টা করেছিল। আমার সিস্টেমে এগুলি নিম্নরূপ:

  1. /etc/profile
  2. /etc/profile.d/*(এতে বিভিন্ন স্ক্রিপ্ট /etc/profile.d/)
  3. /home/<username>/.bash_profile (এটি ব্যর্থ হয়, আমার কাছে এ জাতীয় কোনও ফাইল নেই)
  4. /home/<username>/.bash_login (এটি ব্যর্থ হয়, আমার কাছে এ জাতীয় কোনও ফাইল নেই)
  5. /home/<username>/.profile
  6. /home/<username>/.bashrc
  7. /home/<username>/.bash_history (কমান্ড লাইনের ইতিহাস; এটি কোনও স্ক্রিপ্ট নয়)
  8. /usr/share/bash-completion/bash_completion
  9. /etc/bash_completion.d/* (স্বতঃপূরণ কার্যকারিতা সরবরাহকারী বিভিন্ন স্ক্রিপ্ট)
  10. /etc/inputrc (কী বাইন্ডিংগুলি সংজ্ঞায়িত করে; এটি কোনও স্ক্রিপ্ট নয়)

man straceআরও তথ্যের জন্য ব্যবহার করুন।


আপনার ইনপুট জন্য ধন্যবাদ, কিন্তু আমি মনে করি আমার বাশ সঙ্গে গুরুতর কিছু ভুল আছে। echo $0টার্মিনালে চালানো -bashপ্রত্যাশার চেয়ে দেয় bash। আপনার কি এই জন্য অন্য কোন পরামর্শ আছে?
smac89

3
@ স্ম্যাক 89: লগইন শেলের জন্য এটি সাধারণ। বাশ লগইন শেল হিসাবে আচরণ করে যখন এর প্রথম অক্ষর $0ড্যাশ হয় -, বা যখন বিকল্পের সাথে ডাকা হয় -l
অ্যালেক্সপি

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

কেন তুমি পুরানো ঢঙের উপায় ডিবাগ না, রেখে echo PATH=\""$PATH"\"শুরুতে এবং শেষে .profileএবং .bashrc? কোন কারণে তোমরা সবাই যা করে এবং হয় সম্পূর্ণরূপে পাথ সেট, বা, যদি একটি ডিরেক্টরি যোগ পাহারায় না: echo ":$PATH:" | grep -q ":/path/to/dir:" || export PATH="$PATH:/path/to/dir"?
অ্যালেক্সপি

4
sudo bash -c "echo exit|dtruss bash -li|& less|grep '^open'"ম্যাকোস-এ ব্যবহার করুন। (ঠিক প্রতিস্থাপন straceসঙ্গে dtruss)
ম্যাক্স Coplan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.