একটি সিমিলিংকের মাধ্যমে কার্যকর করার সময় বর্তমান স্ক্রিপ্টের পাথ পান


58

আমার কয়েকটি ইউটিলিটি রয়েছে যাতে কয়েকটি ব্যাশ স্ক্রিপ্ট এবং সহায়ক ফাইল রয়েছে যা বেশ কয়েকটি মেশিনে প্রতিটি মেশিনে ভিন্ন ভিন্ন ডিরেক্টরিতে স্থাপন করা হবে। স্ক্রিপ্টগুলিতে তাদের সাথে সম্পর্কিত পাথগুলি উল্লেখ করতে সক্ষম হওয়া দরকার সুতরাং বর্তমানে সম্পাদিত হওয়া ফাইলটির পাথ পেতে আমার সক্ষম হওয়া দরকার।

আমি আমার dirname $0আইডিয়াটি সম্পর্কে সচেতন যা আমার স্ক্রিপ্টটি সরাসরি ডাকা হলে পুরোপুরি কার্যকর হয়। দুর্ভাগ্যক্রমে একটি সম্পূর্ণ ভিন্ন ডিরেক্টরি থেকে এই স্ক্রিপ্টগুলিতে সিমলিঙ্ক তৈরি করতে সক্ষম হওয়ার ইচ্ছে আছে এবং এখনও আপেক্ষিক পথে চলার যুক্তিযুক্ত কাজ রয়েছে।

সামগ্রিক ডিরেক্টরি কাঠামোর উদাহরণ নিম্নরূপ:

/
 |-usr/local/lib
 |  |-foo
 |  |  |-bin
 |  |  |  |-script.sh
 |  |  |-res
 |  |  |  |-resource_file.txt
 |-home/mike/bin
 |  |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh)

আমি কিভাবে নির্ভরযোগ্যভাবে উল্লেখ করতে পারেন /usr/local/lib/foo/res/resource_file.txtথেকে script.shতা দ্বারা বরকত হয় /usr/local/lib/foo/bin/script.shবা ~mike/bin/link_to_script?

উত্তর:


79

সাধারণ উদ্দেশ্য সমাধান হিসাবে এটি চেষ্টা করুন:

DIR="$(cd "$(dirname "$0")" && pwd)"

নিম্নলিখিত চিহ্নগুলির নির্দিষ্ট ক্ষেত্রে, আপনি এটি করতে পারেন:

DIR="$(dirname "$(readlink -f "$0")")"

আমি চেষ্টা করছি এমন জিনিসগুলির চেয়ে নিখুঁতভাবে কাজ করে এবং সহজতর simp ধন্যবাদ!
মাইক ডেক

@ মাইকডেক উপভোগ করুন নোট করুন যে আমি প্রথম পোস্ট করার পর থেকে কিছু উদ্ধৃত সমস্যা সংশোধন করেছি ... আপনি সর্বশেষ সম্পাদনা থেকে একটি বিকল্প আপনার ইভেন্টে কিছুটা ফাঁকা স্থান বা অন্য পাগল অক্ষর থাকতে পারে এমন ঘটনা ব্যবহার করতে পারেন। এমনকি যদি এই প্রকল্পের জন্য এটি কোনও বিবেচনা না করে তবে আপনি কোডটি নিজের স্ক্রিপ্ট থেকে রাস্তার নিচে অনুলিপি করতে পারেন এবং সর্বোত্তম বিকল্পের বিষয়টি পরে থাকতে পারে!
কালেব

1
আমার স্পষ্ট করা উচিত, দ্বিতীয়টি পুরোপুরি কার্যকরভাবে কাজ করে। আপনি যে প্রথম সমাধানটি দিয়েছেন তা আমার সিস্টেমে সিমলিংকের পক্ষে কাজ করে না।
মাইক ডেক

4
@ মাইকডেক: প্রথম সমাধানটি পথের অংশ হিসাবে বিভিন্ন ডিরেক্টরিকে অনুরূপভাবে যুক্ত করার ক্ষেত্রে সাধারণ ক্ষেত্রে কাজ করে, তবে চূড়ান্ত বাইনারিটি যদি একটি সিমিলিংক হয় তবে সহায়তা করবে না। দ্বিতীয়টি এটি যত্ন নিতে পরিচালনা করে।
কালেব

1
স্ক্রিপ্ট ফাইলটি sourceডি হলে উদাহরণস্বরূপ কাজ করে না (উদাঃ $ source ./sript.sh) এটি উভয় ক্ষেত্রেই কাজ করে:DIR="$(cd "$(dirname "$BASH_SOURCE")" && pwd)"
ফ্র্যাক্টালস্পেস

7

এক লাইন:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))

2
এক লাইনের উত্তরগুলি সাধারণত সর্বাধিক সহায়ক হয় না। আপনার প্রস্তাবিত সমাধানটিকে আরও সমর্থন করে এমন ব্যাখ্যা, লিঙ্ক বা ডকুমেন্টেশন অন্তর্ভুক্ত করতে দয়া করে আপনার উত্তরটি প্রসারিত করার বিষয়ে বিবেচনা করুন।
HalosGhost

1
আসলে, আপনার এটি করার দরকার নেই, মূল উত্তরের রিডলিংক সংস্করণটি ঠিক ঠিক কাজ করে যদি কোনও
সিএমিলিংক

3

readlink -f আমার জন্য কাজ করে না, আমি এই ভুল:

readlink: illegal option -- f
usage: readlink [-n] [file ...]

তবে এটি কাজ করে:

DIR="$(dirname "$(readlink "$0")")"
echo $DIR

3
তারপরে আপনি একটি ম্যাকে রয়েছেন এবং এটি আপনার প্রশ্নের উত্তর দেওয়া উচিত
আইজাক

হ্যাঁ, আমি ম্যাকওস @ আইস্যাক এ আছি, তবে আমার কোনও প্রশ্ন নেই। আমি কমান্ডটি পোস্ট করেছি যা আমার পক্ষে কাজ করে।
কেভিন ক্যাম্পিয়ন

0

উপরের স্ক্রিপ্টে একটি ছোট সংযোজন। পিডাব্লু -ডির পি-পি বিকল্পটি সিমলিঙ্কগুলি অনুসরণ করে

DIR="$(cd "$(dirname "$0")" && pwd -P)"

7
এটি তখনই কাজ করে যখন সিমলিংক ডিরেক্টরি কাঠামোর অংশ হয়। ফাইলটি নিজেই সংযুক্ত হয়ে গেলে এটি কাজ করে না।
অলিভার গন্ডিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.