আমি কিছুটা অবাক হয়েছি যে এখনও কেউ এটির কথা উল্লেখ করেনি, তবে আপনি readlink -fআপেক্ষিক পাথগুলিকে পরম পথে রূপান্তর করতে এবং সেগুলিকে PATH এ যুক্ত করতে পারেন।
উদাহরণস্বরূপ, গিলিয়াম পেরেলাউল্ট-আর্চাম্বল্টের উত্তরে উন্নতি করতে,
pathappend() {
for ARG in "$@"
do
if [ -d "$ARG" ] && [[ ":$PATH:" != *":$ARG:"* ]]; then
PATH="${PATH:+"$PATH:"}$ARG"
fi
done
}
হয়ে
pathappend() {
for ARG in "$@"
do
if [ -d "$ARG" ] && [[ ":$PATH:" != *":$ARG:"* ]]
then
if ARGA=$(readlink -f "$ARG") #notice me
then
if [ -d "$ARGA" ] && [[ ":$PATH:" != *":$ARGA:"* ]]
then
PATH="${PATH:+"$PATH:"}$ARGA"
fi
else
PATH="${PATH:+"$PATH:"}$ARG"
fi
fi
done
}
1. মূল বিষয়গুলি - এটি কী ভাল করে?
readlink -fকমান্ড (অন্যান্য বিষয় ছাড়াও) একটি সুনির্দিষ্ট পাথ করার জন্য একটি আপেক্ষিক পাথ রূপান্তরিত করবে। এটি আপনাকে এমন কিছু করতে দেয়
$ সিডি / পাথ / টু / আমার / বিন / দির
$ পাঠপেন্ড ।
$ প্রতিধ্বনি "AT পথ"
<আপনার_পরে_পথ> : / পথ / থেকে / আমার / বিন / দির
২. আমরা দু'বার পথের পরীক্ষার জন্য কেন পরীক্ষা করি?
ঠিক আছে, উপরের উদাহরণ বিবেচনা করুন। যদি ব্যবহারকারী দ্বিতীয়বার ডিরেক্টরি
থেকে বলেন ,
হবে । অবশ্যই উপস্থিত হবে না । কিন্তু তারপর সেট করা হবে
(এর সঠিক পথটি সমতুল্য ), যা হয় আগে থেকেই । সুতরাং আমরা যোগ এড়িয়ে চলতে হবে থেকে একটি দ্বিতীয় সময়।pathappend ./path/to/my/bin/dirARG..PATHARGA/path/to/my/bin/dir.PATH/path/to/my/bin/dirPATH
সম্ভবত আরও গুরুত্বপূর্ণভাবে, এর প্রাথমিক উদ্দেশ্যটি readlinkহ'ল এটির নাম অনুসারে প্রতীকী লিঙ্কটি দেখতে এবং এতে থাকা পথের নামটি পড়তে হবে (অর্থাত্ পয়েন্টগুলি)। উদাহরণ স্বরূপ:
$ ls -ld /usr/lib/perl/5.14
-rwxrwxrwx 1 root root Sep 3 2015 /usr/lib/perl/5.14 -> 5.14.2
$ readlink /usr/lib/perl/5.14
5.14.2
$ readlink -f /usr/lib/perl/5.14
/usr/lib/perl/5.14.2
এখন, যদি আপনি বলেন pathappend /usr/lib/perl/5.14, এবং আপনার ইতিমধ্যে /usr/lib/perl/5.14আপনার পথের মধ্যে আছে , ভাল, ভাল; আমরা ঠিক যেমন এটি রেখে দিতে পারি। কিন্তু, যদি /usr/lib/perl/5.14আপনার পাথ ইতিমধ্যে নয়, আমরা কল readlinkএবং পেতে ARGA= /usr/lib/perl/5.14.2, এবং তারপর আমরা যোগ যে করতে PATH। তবে এক মিনিট অপেক্ষা করুন - যদি আপনি ইতিমধ্যে বলে থাকেন pathappend /usr/lib/perl/5.14তবে /usr/lib/perl/5.14.2আপনার প্যাথএলটি ইতিমধ্যে রয়েছে এবং এটি আবার PATHদ্বিতীয়বার এড়াতে আমাদের এটিকে পরীক্ষা করতে হবে ।
৩. ডিল কী if ARGA=$(readlink -f "$ARG")?
যদি এটি অস্পষ্ট থাকে তবে এই লাইনটি readlinkসফল হয় কিনা তা পরীক্ষা করে । এটি কেবল ভাল, রক্ষণাত্মক প্রোগ্রামিং অনুশীলন। যদি আমরা কমান্ড এম থেকে আউটপুট ব্যবহার করতে যাচ্ছি কমান্ড এন (যেখানে এম < এন ) এর অংশ
হিসাবে , কমান্ড এম ব্যর্থ হয়েছে কিনা তা পরীক্ষা করে দেখার এবং এটি কোনওভাবে হ্যান্ডেল করা বুদ্ধিমানের কাজ । আমি মনে করি না এটি সম্ভবত ব্যর্থ হবে - তবে ওএস এক্স
এবং অন্য কোথাও একটি স্বেচ্ছাসেবীর ফাইলের নিখুঁত পথটি কীভাবে পুনরুদ্ধার করবেন তা আলোচিত , এটি একটি জিএনইউ আবিষ্কার is এটি পসিক্সে নির্দিষ্ট করা হয়নি, সুতরাং ম্যাক ওএস, সোলারিস এবং অন্যান্য নন-লিনাক্স ইউনিক্সগুলিতে এর উপস্থিতি প্রশ্নবিদ্ধ। (আসলে, আমি কেবল একটি মন্তব্য পড়েছি যা এতে বলে “readlinkreadlinkreadlink -fম্যাক ওএস এক্স 10.11.6 এ কাজ করছে বলে মনে হয় না, তবে realpathবাক্স থেকে কাজ করে ”" সুতরাং, আপনি যদি এমন কোনও সিস্টেমে থাকেন readlinkযেখানে readlink -fনেই বা যেখানে কাজ করে না, আপনি এটি সংশোধন করতে সক্ষম হতে পারেন স্ক্রিপ্টটি ব্যবহার করতে হবে realpath)
অবশ্যই, আপনি যদি এমন কোনও সিস্টেমে থাকেন যা readlink(বা realpath) নেই তবে আপনি করতে চান না ।pathappend .
দ্বিতীয় -dপরীক্ষা ( [ -d "$ARGA" ]) সম্ভবত অপ্রয়োজনীয়। আমি এমন কোনও দৃশ্যের কথা ভাবতে পারি না যেখানে $ARGডিরেক্টরি রয়েছে এবং readlinkসফল হয় তবে $ARGAকোনও ডিরেক্টরি নয়। আমি কেবল ifতৃতীয়টি তৈরির জন্য প্রথম বিবৃতিটি অনুলিপি করে আটকে দিয়েছি -dএবং অলসতার বাইরে আমি পরীক্ষাটি রেখেছি ।
4. অন্য কোন মন্তব্য?
হ্যাঁ। এখানে অন্যান্য অনেক জবাবের মতো, এটি একটি পরীক্ষা করে প্রতিটি আর্গুমেন্ট ডিরেক্টরি হয় কিনা, এটি যদি থাকে তবে এটি প্রক্রিয়া করে এবং তা না থাকলে তা এড়িয়ে যায়। আপনি যদি pathappend
কেবলমাত্র " ." ফাইল (যেমন .bash_profileএবং .bashrc) এবং অন্যান্য স্ক্রিপ্টগুলিতে ব্যবহার করেন তবে এটি (বা নাও) পর্যাপ্ত হতে পারে । তবে, যেমন এই উত্তরটি (উপরে) দেখিয়েছে, ইন্টারেক্টিভভাবে এটি ব্যবহার করা একেবারে সম্ভাব্য। আপনি যদি খুব অবাক হন
$ pathappend /usr/local/nysql/bin
$ mysql
-bash: mysql: command not found
আপনি লক্ষ্য করেছেন য়ে আমি বলেছিলাম nysql
মধ্যে pathappendকমান্ড বদলে mysql? এবং এটি pathappendকিছুই বলেনি; এটা কি চুপচাপ ভুল যুক্তি উপেক্ষা?
আমি উপরে বলেছি ত্রুটিগুলি পরিচালনা করা ভাল অনুশীলন। এখানে একটি উদাহরণ:
pathappend() {
for ARG in "$@"
do
if [ -d "$ARG" ]
then
if [[ ":$PATH:" != *":$ARG:"* ]]
then
if ARGA=$(readlink -f "$ARG") #notice me
then
if [[ ":$PATH:" != *":$ARGA:"* ]]
then
PATH="${PATH:+"$PATH:"}$ARGA"
fi
else
PATH="${PATH:+"$PATH:"}$ARG"
fi
fi
else
printf "Error: %s is not a directory.\n" "$ARG" >&2
fi
done
}