আমি কিছুটা অবাক হয়েছি যে এখনও কেউ এটির কথা উল্লেখ করেনি, তবে আপনি 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/dir
ARG
.
.
PATH
ARGA
/path/to/my/bin/dir
.
PATH
/path/to/my/bin/dir
PATH
সম্ভবত আরও গুরুত্বপূর্ণভাবে, এর প্রাথমিক উদ্দেশ্যটি 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 এটি পসিক্সে নির্দিষ্ট করা হয়নি, সুতরাং ম্যাক ওএস, সোলারিস এবং অন্যান্য নন-লিনাক্স ইউনিক্সগুলিতে এর উপস্থিতি প্রশ্নবিদ্ধ। (আসলে, আমি কেবল একটি মন্তব্য পড়েছি যা এতে বলে “readlink
readlink
readlink -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
}