একটি স্ক্রিপ্ট থেকে পরম পাথ সন্ধান করুন


10

একটি স্ক্রিপ্টে আমি $0এটির সম্ভাব্য আপেক্ষিক পথে পাচ্ছি। একে নিখুঁত রূপান্তর করার জন্য আমি এই সমাধানটি পেয়েছি যা আমি বুঝতে পারি না:

abspath=$(cd ${0%/*} && echo $PWD/${0##*/})

আমার সমস্যাটি হ'ল ভিতরে ${0%/*}এবং এর যাদু ${0##*/}। দেখে মনে হচ্ছে যে প্রাক্তনটি নামটির নামটি বের করে এবং পরেরটি ফাইলটির নাম বের করে, আমি কীভাবে তা পাই না।


2
এটি প্যারামিটার সম্প্রসারণ ব্যবহার করে, তবে এটি আমার পক্ষে কার্যকর হয়নি। যদি আপনার স্ক্রিপ্টটি কেবল লিনাক্সে ব্যবহার করা হয়, আপনি readlink -f $0ক্যানোনিকাল পাথ পেতে ব্যবহার করতে পারেন ।
শন জে গফ 13

1
@ শাহন: ১ টি দুর্দান্ত মন্তব্য ভোট কারণ আপনি সঠিক চিন্তাভাবনা প্রবর্তন করেছেন: "এটি প্যারামিটার সম্প্রসারণ ব্যবহার করে, তবে এটি আমার পক্ষে কার্যকর হয়নি"। ব্যবহার dirnameএখানে দরকারী।
ডি

mywiki.wooledge.org/BashFAQ/028 এবং cyberciti.biz/faq/… বলছেন এর BASH_SOURCEচেয়ে ভাল $0, যেমন $0ব্যবহারকারীর টাইপড কমান্ড দেয় যা বর্তমানে কার্যকর স্ক্রিপ্ট নাও হতে পারে।
জোয়েল পুররা

উত্তর:


8

সজ্ঞা:

${string%substring} এর সংক্ষিপ্ততম ম্যাচটি $substringশেষ থেকে মুছে ফেলে $string

${string##substring}$substringশুরু থেকে দীর্ঘতম ম্যাচটি মুছে দেয় $string

আপনার উদাহরণ:

abspath=$(cd ${0%/*} && echo $PWD/${0##*/})

${0%/*} স্ক্রিপ্টের ডিরেক্টরি নাম (যা কোনও আপেক্ষিক পাথ হতে পারে) দিয়ে সর্বশেষ স্ল্যাশের পরে সমস্ত কিছু মুছে ফেলে।

${0##*/} আপনাকে কেবল স্ক্রিপ্টের নাম দিয়ে শেষ স্ল্যাশ পর্যন্ত সমস্ত কিছু মুছে ফেলে।

সুতরাং, এই কমান্ডটি স্ক্রিপ্টের ডিরেক্টরিতে পরিবর্তিত হয় এবং বর্তমান কার্যনির্বাহী ডিরেক্টরি (প্রদত্ত $PWD) এবং স্ক্রিপ্টের নামটি আপনাকে পরম পথ দেয় conc

কী চলছে তা দেখার জন্য:

echo ${0%/*}
echo ${0##*/}

শেল বিশেষ অক্ষর সম্বলিত (প্রায় সমস্ত) ফাইলের নামগুলি মোকাবেলা করতে সমস্ত পরিবর্তনশীল বিস্তারের চারপাশে দ্বৈত উদ্ধৃতি যুক্ত করুন।
গিলস

10

শন সহজ সমাধান ছিল: readlink -f $0। আপনি যদি অদ্ভুত ফাইলের নামগুলি হ্যান্ডেল করার বিষয়ে নিশ্চিত হতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

absolute_path_x="$(readlink -fn -- "$0"; echo x)"
absolute_path="${absolute_path_x%x}"

নথিপত্র


1
চূড়ান্ত নিউলাইনগুলি সঠিকভাবে পরিচালনা করা ভাল। দুর্ভাগ্যক্রমে readlink -fnলিনাক্স, নেটবিএসডি এবং ওপেনবিএসডি-তে নির্দিষ্ট।
গিলস

4

এই কাজটি করার জন্য এখানে একটি নিরাপদ এবং আরও পঠনযোগ্য উপায়:

abspath=$(unset CDPATH && cd "$(dirname "$0")" && echo $PWD/$(basename "$0"))

মন্তব্য:

  • যদি $0পূর্বের পাথবিহীন একটি খালি ফাইল নাম থাকে তবে মূল স্ক্রিপ্টটি ব্যর্থ হবে তবে এখানে প্রদত্ত একটিটি কাজ করবে। (সমস্যা নেই $0তবে অন্যান্য অ্যাপ্লিকেশনগুলিতে হতে পারে))
  • যদি ফাইলে পাথটি আসলে না থাকে তবে পদ্ধতির ব্যর্থতা ঘটবে। (সমস্যা নেই $0, তবে অন্যান্য অ্যাপ্লিকেশনগুলিতেও হতে পারে))
  • unsetঅপরিহার্য আপনার ব্যবহারকারী হতে পারে যদি CDPATHসেট।
  • এর বিপরীতে readlink -fবা realpath, এটি ইউনিক্সের নন-লিনাক্স সংস্করণগুলিতে কাজ করবে (যেমন, ম্যাক ওএস এক্স)।

2

আপনি যদি শেল প্যারামিটার সম্প্রসারণ শিখতে চান তবে আপনি এখান থেকে এটি পড়তে পারেন তবে এক্সপেনশন সবসময় ভাল পছন্দ নয়। এই ক্ষেত্রে, প্রায় প্রতিটি ইউনিক্সের মতো সিস্টেমের 2 টি ভাল ব্যবহার রয়েছে:

basename
dirname

প্রথমটি ফাইলের নামটি বের করে দেবে, যখন দ্বিতীয়টি পথটি বের করে দেবে, সুতরাং আপনার যদি $ 0 থাকে তবে বলুন:

dirname $0

এবং আপনি পথ পাবেন।

চিয়ার্স


dirname আপেক্ষিক পাথ ফিরে আসতে পারে
opticeclic

0

পিডাব্লুডির পরিচয়, বাশ বিল্টিন। জিএনইউ কোর্টিল প্যাকেজেও পাওয়া গেছে।

$ sh ./cygdrive/c/cygwin/home/../../../../home/jaroslav/tmp/somewhere.sh
$0: ./cygdrive/c/cygwin/home/../../../../home/jaroslav/tmp/somewhere.sh
cheeky binary from /home/jaroslav/tmp (/home/jaroslav/tmp)

$ cat /home/jaroslav/tmp/somewhere.sh

abs=$( cd `dirname "$0"` ; pwd -P)
absBin=$( cd `dirname "$0"` ; /bin/pwd -P)
echo \$0: $0
echo cheeky binary from $abs \($absBin\)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.