দেখ! শিল্প-শক্তি 12-লাইন ... টেকনিক্যালি bash- এবং zsh-পোর্টেবল শেল ফাংশন যা দৃঢ়ভাবে ভালবাসে আপনার ~/.bashrc
বা ~/.zshrc
পছন্দের প্রারম্ভে স্ক্রিপ্ট:
# void +path.append(str dirname, ...)
#
# Append each passed existing directory to the current user's ${PATH} in a
# safe manner silently ignoring:
#
# * Relative directories (i.e., *NOT* prefixed by the directory separator).
# * Duplicate directories (i.e., already listed in the current ${PATH}).
# * Nonextant directories.
+path.append() {
# For each passed dirname...
local dirname
for dirname; do
# Strip the trailing directory separator if any from this dirname,
# reducing this dirname to the canonical form expected by the
# test for uniqueness performed below.
dirname="${dirname%/}"
# If this dirname is either relative, duplicate, or nonextant, then
# silently ignore this dirname and continue to the next. Note that the
# extancy test is the least performant test and hence deferred.
[[ "${dirname:0:1}" == '/' &&
":${PATH}:" != *":${dirname}:"* &&
-d "${dirname}" ]] || continue
# Else, this is an existing absolute unique dirname. In this case,
# append this dirname to the current ${PATH}.
PATH="${PATH}:${dirname}"
done
# Strip an erroneously leading delimiter from the current ${PATH} if any,
# a common edge case when the initial ${PATH} is the empty string.
PATH="${PATH#:}"
# Export the current ${PATH} to subprocesses. Although system-wide scripts
# already export the ${PATH} by default on most systems, "Bother free is
# the way to be."
export PATH
}
তাত্ক্ষণিক গৌরব জন্য নিজেকে প্রস্তুত। তারপরে, এটি না করে এবং ইচ্ছুকভাবে সেরাটির জন্য আশা করার চেয়ে:
export PATH=$PATH:~/opt/bin:~/the/black/goat/of/the/woods/with/a/thousand/young
পরিবর্তে এটি করুন এবং সর্বোত্তম হওয়ার গ্যারান্টিযুক্ত হোন, আপনি এমনকি সত্যই এটি চেয়েছিলেন বা না:
+path.append ~/opt/bin ~/the/black/goat/of/the/woods/with/a/thousand/young
ভেরি ওয়েল, "সেরা" সংজ্ঞা দিন।
নিরাপদে বর্তমানের উপর সংযোজন এবং প্রিন্টিং ${PATH}
এটি সাধারণভাবে তৈরি হওয়া তুচ্ছ বিষয় নয়। সুবিধাজনক এবং আপাতদৃষ্টিতে বোধগম্য হওয়ার সময়, ফর্মের এক-লাইনার এতে export PATH=$PATH:~/opt/bin
শয়তানী জটিলতাগুলিকে আমন্ত্রণ জানায়:
দুর্ঘটনাক্রমে আপেক্ষিক নামকরণ (উদাঃ export PATH=$PATH:opt/bin
)। যদিও bash
এবং zsh
চুপি চুপি গ্রহণ এবং বেশিরভাগ আপেক্ষিক dirnames উপেক্ষা সবচেয়ে ক্ষেত্রে, আপেক্ষিক dirnames হয় এর পূর্বে সমাধান h
বা t
(এবং সম্ভবত অন্যান্য বদমাইশ অক্ষর) উভয় কারণ লজ্জাজনকভাবে নিজেদের Ala Masaki Kobayashi এর অঙ্গচ্ছেদ করা ধাতুগত 1962 মাষ্টারপিস Harakiri :
# Don't try this at home. You will feel great pain.
$ PATH='/usr/local/bin:/usr/bin:/bin' && export PATH=$PATH:harakiri && echo $PATH
/usr/local/bin:/usr/bin:arakiri
$ PATH='/usr/local/bin:/usr/bin:/bin' && export PATH=$PATH:tanuki/yokai && echo $PATH
binanuki/yokai # Congratulations. Your system is now face-up in the gutter.
দুর্ঘটনাক্রমে নকল নাম। ডুপ্লিকেট ${PATH}
ডায়ারনেমগুলি যদিও বেশিরভাগ ক্ষেত্রে নিস্পাপ, তবুও এগুলি অযাচিত, জটিল, হালকাভাবে অক্ষম, ডিবাগিবিলিটি বাধাগ্রস্ত করে এবং ড্রাইভ পরিধান প্রচার করে - এই উত্তরের মতো সাজানো। যদিও ন্যানড-স্টাইলের এসএসডিগুলি ( অবশ্যই ) পরা পড়ার জন্য অনাক্রম্যতা রয়েছে, এইচডিডি নেই। প্রতিটি চেষ্টা করা কমান্ডে অপ্রয়োজনীয় ফাইল সিস্টেম অ্যাক্সেস একই টেম্পোতে অপ্রয়োজনীয় পঠিত মাথা পরিধান করে। নেস্টেড সাবপ্রোসেসেসে নেস্টেড শেলসকে ডাকার সময় সদৃশগুলি বিশেষত অস্পষ্ট হয়, যেখানে আপাতদৃষ্টিতে নির্দোষ ওয়ান-লাইনারগুলি export PATH=$PATH:~/wat
দ্রুত ${PATH}
নরকের মতো সপ্তম বৃত্তে বিস্ফোরিত হয় PATH=/usr/local/bin:/usr/bin:/bin:/home/leycec/wat:/home/leycec/wat:/home/leycec/wat:/home/leycec/wat
। আপনি যদি তখন অতিরিক্ত ডায়ারনাম যুক্ত করেন তবে কেবলমাত্র বেলজেবুবা আপনাকে সহায়তা করতে পারে। (আপনার মূল্যবান বাচ্চাদের ক্ষেত্রে এটি ঘটতে দেবেন না। )
- দুর্ঘটনাবশত ডেরনাম মিস করছি। আবার, অনুপস্থিত
${PATH}
ডেরনামগুলি মূলত নির্দোষ হয়ে ওঠার পরেও তারা সাধারণত অযাচিত, জটিল, হালকাভাবে অক্ষম, ডিবাগিবিলিটি বাধা দেয় এবং ড্রাইভ পরিধানকে প্রচার করে।
ইতিমধ্যে, উপরে সংজ্ঞায়িত শেল ফাংশনের মতো বন্ধুত্বপূর্ণ অটোমেশন। আমাদের নিজেদের থেকে নিজেকে বাঁচাতে হবে।
তবে ... কেন "+ path.append ()"? স্রেফ অ্যাপেন্ড_পথ () কেন নয়?
Disambiguity (যেমন, বর্তমান বাইরের কমান্ড সহ জন্য ${PATH}
অথবা সিস্টেম-ব্যাপী শেল অন্যত্র সংজ্ঞায়িত ফাংশন), ব্যবহারকারী-সংজ্ঞায়িত শেল ফাংশন আদর্শভাবে পূর্বে সমাধান করা হয় বা দ্বারা সমর্থিত অনন্য সাবস্ট্রিং সঙ্গে suffixed bash
এবং zsh
কিন্তু অন্যথায় মান কমান্ড basenames নিষিদ্ধ - মত, বলো, +
।
আরে। এটা কাজ করে। আমাকে বিচার করবেন না।
তবে ... কেন "+ path.append ()"? "+ Path.prepend ()" কেন নয়?
যেহেতু বর্তমানের সাথে সংযোজন বর্তমানের ${PATH}
প্রিপেন্ডিংয়ের চেয়ে নিরাপদ ${PATH}
, সমস্ত জিনিস সমান, যা সে কখনও হয় না। ব্যবহারকারী-নির্দিষ্ট কমান্ডগুলির সাথে সিস্টেম-ব্যাপী কমান্ডগুলি ওভাররাইড করা সর্বোত্তমভাবে নির্জনাত্মক হতে পারে এবং সবচেয়ে খারাপ সময়ে তৈরি হতে পারে। লিনাক্সের অধীনে, উদাহরণস্বরূপ, ডাউন স্ট্রিম অ্যাপ্লিকেশনগুলি সাধারণত কাস্টম অ-মানক ডেরাইভেটিভ বা বিকল্পগুলির পরিবর্তে জিএনইউ কোর্টিলস কমান্ডের রূপের প্রত্যাশা করে ।
এটি বলেছে যে, এটি করার জন্য বৈধ ব্যবহারের কেস অবশ্যই রয়েছে। সমতুল্য +path.prepend()
ফাংশন সংজ্ঞায়িত করা তুচ্ছ। তার এবং তার ভাগ করা ধর্মহীনতার জন্য সান্স প্রোলিক্স নেবুলোসিটি:
+path.prepend() {
local dirname
for dirname in "${@}"; do
dirname="${dirname%/}"
[[ "${dirname:0:1}" == '/' &&
":${PATH}:" != *":${dirname}:"* &&
-d "${dirname}" ]] || continue
PATH="${dirname}:${PATH}"
done
PATH="${PATH%:}"
export PATH
}
কিন্তু ... গিলস কেন নয়?
গিলেজ ' গৃহীত উত্তর অন্যত্র হিসেবে সাধারণ ক্ষেত্রে আকর্ষণীয় অনুকূল হয় "শেল অজ্ঞেয়বাদী idempotent পরিশেষে যোগ" । সাধারণ যদি bash
এবং zsh
সঙ্গে কোন অবাঞ্ছিত symlinks অবশ্য পারফরম্যান্স শাস্তি তাই দুশ্চিন্তা করার প্রয়োজন জেন্টু ricer আমার মধ্যে। এমনকি অনাকাঙ্ক্ষিত প্রতীকগুলির উপস্থিতিতেও, add_to_PATH()
যুক্তি অনুসারে একটি সাবসেল কাঁটা ফোটানো সিমিলিং ডুপ্লিকেটগুলির সম্ভাব্য সন্নিবেশের পক্ষে মূল্যবান কিনা তা বিতর্কযোগ্য ।
এমনকি সিমলিংক ডুপ্লিকেটগুলিও মুছে zsh
ফেলার দাবি করে কঠোর ব্যবহারের ক্ষেত্রে, এই স্পেসিফিক বৈকল্পিকটি অদক্ষ কাঁটাচামচ না করে দক্ষ বিল্টিনগুলির মাধ্যমে এটি করে:
+path.append() {
local dirname
for dirname in "${@}"; do
dirname="${dirname%/}"
[[ "${dirname:0:1}" == '/' &&
":${PATH}:" != *":${dirname:A}:"* &&
-d "${dirname}" ]] || continue
PATH="${PATH}:${dirname}"
done
PATH="${PATH#:}"
export PATH
}
মূলটির *":${dirname:A}:"*
চেয়ে বরং নোট করুন *":${dirname}:"*
। :A
একটি বিস্ময়কর হল zsh
সহ - -ism দুঃখিতভাবে অন্যান্য অধিকাংশ শাঁস অধীনে অনুপস্থিত bash
। উদ্ধৃতি হিসাবে man zshexpn
:
উত্তর : a
সংশোধক হিসাবে যেমন একটি ফাইলের নামকে একটি নিখুঁত পথে পরিণত করুন এবং তারপরে realpath(3)
প্রতীকী লিঙ্কগুলি সমাধান করতে লাইব্রেরি ফাংশনের মাধ্যমে ফলাফলটি পাস করুন । দ্রষ্টব্য: যে সমস্ত সিস্টেমে realpath(3)
লাইব্রেরি ফাংশন নেই, প্রতীকী লিঙ্কগুলি সমাধান করা হয় না, সেই পদ্ধতিগুলিতে a
এবং A
সমতুল্য।
আর কোনো প্রশ্ন না.
আপনাকে স্বাগতম. নিরাপদ গোলাগুলি উপভোগ করুন। আপনি এখন এটি প্রাপ্য।