বাশ স্ক্রিপ্ট লেখার সময় আমি কীভাবে বর্তমান ফাইলটির অবস্থানের নিখুঁত পথ পাব?


16

ধরুন আমার কাছে একটি বাশ ফাইল কল রয়েছে myBash.bash। এটি এতে বাস করে:

/myDirect/myFolder/myBash.bash

এখন আমি স্ক্রিপ্টের ভিতরে স্ট্রিং /myDirect/myFolder(অবস্থান myBash.bash) ব্যবহার করতে চাই । এই অবস্থানটি খুঁজতে আমি কি কোনও আদেশ ব্যবহার করতে পারি?

সম্পাদনা করুন: ধারণাটি হ'ল আমি একটি জিপ-ফোল্ডার কোডের সাথে সেটআপ করতে চাই যা সেই জিপ-ফাইলের ভিতরে ব্যাশ স্ক্রিপ্ট দ্বারা শুরু করা যেতে পারে। আমি সেই জিপ-ফাইলের অভ্যন্তরে কোডের আপেক্ষিক ফাইল-পাথগুলি জানি, তবে পরম পাথগুলি নয় এবং আমার সেগুলি দরকার। একটি উপায় হ'ল পথে হার্ড-কোড করা, অথবা ফাইলের পাথটি ভেরিয়েবল হিসাবে দেওয়া দরকার। তবে আমি এটিকে আরও সহজ করব যদি বাশ-ফাইলের পক্ষে এটি কোথায় রয়েছে তা নির্ধারণ করা এবং তারপরে জিপ-ফাইলের কাঠামোর জ্ঞান থেকে অন্য ফাইলের সাথে সম্পর্কিত পথগুলি তৈরি করা সম্ভব হয়েছিল।


3
এটি স্ট্যাকওভারফ্লোয়ের জন্য আরও উপযুক্ত। এই প্রশ্নগুলি যাচাই করুন: stackoverflow.com/questions/4774054/… স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 59895/…
শেঠোস দ্বিতীয়

1
কিভাবে ব্যবহার। দয়া করে স্পষ্ট করে বলুন
সের্গেই কলডায়াজনি

1
@ শেঠোসআই এই প্রশ্নটি এখানে পুরোপুরি বিষয়টিতে রয়েছে
জান্না

1
আমি প্রশ্নের আরও প্রসঙ্গ যুক্ত করেছি। আমি ভেবেছিলাম যে ফাইলটি চালাচ্ছে তার ফাইল-পাথ পাওয়ার জন্য একটি সহজ / সুস্পষ্ট কমান্ড থাকতে পারে, তবে মনে হচ্ছে উত্তরটি কমপক্ষে অ-সুস্পষ্ট।
ডিম্পল

3
@ জান্না আমি এটি অফটোপিক বলি না, আমি মনে করি এটি কেবল আরও উপযুক্ত এবং ইতিমধ্যে জিজ্ঞাসা করা হয়েছে এবং একাধিকবার উত্তর দেওয়া লিঙ্কগুলির সাথে দেখানো হয়েছে।
শেঠস II

উত্তর:


24

আপনি পুরো পথটি পেতে পারেন:

realpath "$0"

এবং সার্গ দ্বারা নির্দেশিত হিসাবে আপনি dirnameএইরকম ফাইলের নামটি স্ট্রিপ করতে ব্যবহার করতে পারেন

dirname "$(realpath $0)"

বা আরও জটিল ফাইল ফাইলগুলির সাথে বিশ্রী উদ্ধৃতি এবং শব্দ বিভাজন রোধ করা আরও ভাল:

temp=$( realpath "$0"  ) && dirname "$temp"

এটির বিশ্লেষণকারী আমার পূর্বের ধারণার চেয়ে অনেক ভাল (আমি জানতাম আরও ভাল উপায় হবে!)

realpath "$0" | sed 's|\(.*\)/.*|\1|'

মন্তব্য

  • realpath কোনও ফাইলের আসল পথে ফেরত দেয়
  • $0 এই ফাইলটি (স্ক্রিপ্ট)
  • s|old|new|oldসঙ্গে প্রতিস্থাপনnew
  • \(.*\)//পরে কোনও অক্ষর সংরক্ষণ করুন
  • \1 সংরক্ষিত অংশ

2
ব্যবহার $0এবং sedযাদুবিদ্যার জন্য +1 । তবে এই seddirname
যাদুটি

2
আপনার কাছে ইতিমধ্যে উত্তর আছে, ব্যবহার করুন realpath: realpath "$( dirname $0 )"আমি ব্যক্তিগতভাবে ব্যবহার করব readlinkতবে এটিই আমি :readlink -e $(dirname $0)
সের্গি কোলোডিয়াজহনি

@ সার্জ: dirname "$(realpath "$0")"আরও ভাল না ? সাধারণত কেউ উল্লিখিত ফাইলটিকে উল্লেখ করে প্রতীকী লিঙ্কের পিতামহিত ডিরেক্টরিটির পরিবর্তে রেফারেন্সযুক্ত ফাইলের পিতৃ ডিরেক্টরিটি জানতে চায়।
ডেভিড ফোস্টার

4
@ সার্জ "$(dirname "$(realpath "$0")")"সবচেয়ে সোজা উপায়। অভ্যন্তরের কোটগুলি $()স্বাভাবিক হিসাবে কাজ করে।
ডিপ্রেশনডানিয়েল

@ ডিপ্রেসডডানিয়েল অনলাইনে কিছুটা গবেষণা করেছেন, আপনি ঠিক বলেছেন: সাবস্কেল হওয়ায় $()বাইরে উদ্ধৃতি দেওয়া হবে। আমি এটি $()
এতটা

5

লিপিটি যদি আপনার পথে থাকে তবে আপনি এর মতো কিছু ব্যবহার করতে পারেন

$ myloc=$(dirname "$(which foo.sh)")
$ echo "$myloc"
/path/to/foo.sh

সম্পাদনা করুন: সার্গের কাছ থেকে মন্তব্যগুলি পড়ার পরে, এটি একটি জেনেরিক সমাধান হতে পারে যা স্ক্রিপ্টটি আপনার পথে রয়েছে কিনা তা কাজ করে।

myloc==$(dirname "$(realpath $0)")
dirname "$myloc"

whichযখন স্ক্রিপ্টটি PATHচলক অংশের একটি ডিরেক্টরিতে থাকে তখন তার জন্য আরও উপযুক্ত suitable ব্যবহার করুন $0একটি স্ক্রিপ্ট মধ্যে থেকে শুধু Zanna শো মত। তবে আপনার উত্তরটি যথাযথ যেহেতু আপনি dirnamesed
গণ্ডগোলের

5

গৃহীত উত্তরটি নিখুঁত বলে মনে হচ্ছে। এটি করার আরেকটি উপায় এখানে রয়েছে:

cd "$(dirname "$0")"
/bin/pwd

/bin/pwdpwdবিল্টিন কমান্ডের বিপরীতে ডিরেক্টরিটির আসল পথ মুদ্রণ করে ।


0
wdir="$PWD"; [ "$PWD" = "/" ] && wdir=""
case "$0" in
  /*) scriptdir="${0}";;
  *) scriptdir="$wdir/${0#./}";;
esac
scriptdir="${scriptdir%/*}"
echo "$scriptdir"

এটি কেনোরব এবং অ্যান্ড্রো থেকে রেফারেন্স
, রিডলিঙ্ক, রিয়েলপ্যাথ, BASH_SOURCE থেকে রেফারেন্স হিসাবে নেওয়া হয়েছে
সমস্ত বিল্টইনস

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