$ PATH- তে পাওয়া স্ক্রিপ্টের একই ডিরেক্টরিতে একটি ফাইল পড়ুন


33

আমার কাছে বাশ স্ক্রিপ্ট ফাইল রয়েছে, যা কিছু ডিরেক্টরিতে রাখা হয়েছে $ PATH এ যুক্ত করা যাতে আমি যে কোনও ডিরেক্টরি থেকে স্ক্রিপ্টটি কল করতে পারি।

স্ক্রিপ্টের মতো একই ডিরেক্টরিতে আরও একটি পাঠ্য ফাইল রয়েছে। আমি ভাবছি স্ক্রিপ্টের টেক্সট ফাইলটি কীভাবে উল্লেখ করব?

উদাহরণস্বরূপ, যদি স্ক্রিপ্টটি কেবল টেক্সট ফাইলের বিষয়বস্তু আউটপুট cat textfileকরতে হয় তবে কাজ করবে না, যেহেতু ভিন্ন ডিরেক্টরি থেকে স্ক্রিপ্টটি কল করার সময়, পাঠ্য ফাইলটি খুঁজে পাওয়া যায় না।



: এই প্রশ্নের উত্তর কিভাবে নির্ভরযোগ্যভাবে একটি ব্যাশ স্ক্রিপ্ট ফাইল পাথ পেতে, আমি আমার পথে যে যোগ stackoverflow.com/q/4774054/1695680
ThorSummoner

উত্তর:


24

এগুলি একই কাজ করা উচিত, যতক্ষণ না কোনও সিমলিংক থাকে (পথ বিস্তারে বা স্ক্রিপ্টে নিজেই):

  • MYDIR="$(dirname "$(realpath "$0")")"

  • MYDIR="$(dirname "$(which "$0")")"

  • উপরের যে কোনওটির দুটি পদক্ষেপের সংস্করণ:

    MYSELF="$(realpath "$0")"

    MYDIR="${MYSELF%/*}"

যদি আপনার স্ক্রিপ্টে যাওয়ার পথে কোনও সিমিলিংক থাকে, তবে whichসেই লিঙ্কটির সমাধান সহ একটি উত্তর সরবরাহ করবে। যদি realpathআপনার সিস্টেমে ডিফল্টরূপে ইনস্টল না করা থাকে তবে আপনি এটি এখানে খুঁজে পেতে পারেন

[সম্পাদনা]: যেহেতু মনে হচ্ছে কালেবের পরামর্শেরrealpath চেয়ে এর কোনও লাভ নেই , তবে সম্ভবত পরবর্তীটি ব্যবহার করা আরও ভাল। আমার সময় পরীক্ষাগুলি নির্দেশ করে যে এটি আসলে দ্রুত itreadlink -f


সমস্যা নেই. realpathআপনার সিস্টেমে কোথা থেকে আসে the (অন্যদের কাছে যার কাছে এটি নেই আপনি ব্যবহার করতে পারেনreadlink -f
কালেব

@ কালেব আসলে আমি ভেবেছিলাম এটি স্ট্যান্ডার্ড জিএনইউ ইউটিলিটিস (কোর্টিল) এর সংস্থার অন্তর্গত, তবে আমি এখন দেখতে পাচ্ছি এটি একটি পৃথক প্যাকেজ
rozcietrzewiacz

@ জর্জিট্রিজেভিয়াক্জ realpathআগের থেকে ফিরে এসেছে readlink -f(এবং এমনকি readlinkআইআইআরসি) ছিল জিএনইউ কোর্টিলগুলিতে (আশেপাশে বেশ কয়েকটি অনুরূপ সরঞ্জাম ছিল। readlink -fশেষ পর্যন্ত ডি ফ্যাক্টো স্ট্যান্ডার্ডে পরিণত হয়েছিল); realpathএখনও এটি ব্যবহার করে এমন স্ক্রিপ্টগুলির সাথে সামঞ্জস্যের জন্য রাখা হয়।
গিলস 'অশুভ হওয়া বন্ধ করুন'

যেখানে এখন আর নেই $(dirname "$(which "$0")")তার সুবিধা কী? এটা কি এক নয়? $(dirname $0)which
উলফআর

readlink -fম্যাক ওএস এক্স 10.11.6 এ কাজ করছে বলে মনে হয় না, তবে realpathবাক্সটি থেকে বেরিয়ে আসে।
গ্রেভ

9

আমার সিস্টেম না থাকে realpathযেমন rozcietrzewiacz দ্বারা প্রস্তাবিত

আপনি readlinkকমান্ডটি ব্যবহার করে এটি সম্পাদন করতে পারেন । এটি ওভার পার্সিং whichবা অন্যান্য সমাধানগুলি ব্যবহারের সুবিধা হ'ল যদি পথের একটি অংশ বা সম্পাদনা করা ফাইলের নাম একটি সিমিলিংক ছিল, আপনি প্রকৃত ফাইলটি ডিরেক্টরিটি খুঁজে পেতে সক্ষম হবেন।

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

আপনার পাঠ্য ফাইলটি তখন এর মতো একটি ভেরিয়েবলে পড়তে পারে:

TEXTFILE="$(<$MYDIR/textfile)"

@ ক্রোয়েট্রিজেভিয়াক্জ: আমি আসলে আপনার whichপরামর্শটি উল্লেখ করছি না। এই জন্য স্বাভাবিক সমাধান পারেন শুধু জড়িত dirnameবা সংমিশ্রণ cdএবং pwdএকটি subshell হবে। রিডলিংকের এখানে সুবিধা রয়েছে। realpathবেশিরভাগ ক্ষেত্রে কেবল একটি মোড়ক হিসাবে মনে readlink -fহয়।
কালেব

আমি জানি না কিভাবে এর realpathথেকে আলাদা readlink -f। আমি কেবল দেখতে পাচ্ছি এটি আমাকে একই ফলাফল দেয় (বিপরীতে which)।
rozcietrzewiacz

মনে রাখবেন যে readlink -f(জিএনইউ কোর্টিলস থেকে) পাথের শেষ উপাদানটি বিদ্যমান থাকার প্রয়োজন নেই, readlink -eকরে তবে এটি সমর্থন করে না busybox readlink, যা -eতাদের -fবিকল্পের আচরণের অনুকরণ করে ।
ড্রাগন 788

8

$0স্ক্রিপ্টে স্ক্রিপ্টের পুরো পথ dirnameহবে এবং একটি পুরো পথ নেবে এবং আপনাকে কেবল ডিরেক্টরি দেবে, যাতে আপনি বিড়াল পাঠ্য ফাইলটিতে এটি করতে পারেন:

$ cat "$(dirname -- "$0")/textfile"

এটি realpath $0যদি কাজ না করে বলে মনে হয় , তবে আপনি " $0স্ক্রিপ্টে স্ক্রিপ্টের পুরো পথ হবে " বলে ভুল করছেন ।
rozcietrzewiacz

@roz কি ভাবে?
মাইকেল মরোজেক

1
$0কমান্ডটি এটি চালানো যেমন ছিল, উদাহরণস্বরূপ ../script.sh
roccietrzewiacz

সুতরাং, প্রকৃতপক্ষে স্ক্রিপ্টের আপেক্ষিক পথটি $(dirname "$0")প্রত্যাবর্তিত কমান্ডের অংশ হিসাবে - পরম পাথটি নয়। এটি স্ক্রিপ্টগুলিতে সমস্যা দেখা দিতে পারে যা চলাকালীন ডিরেক্টরি পরিবর্তন করে।
rozcietrzewiacz

@ জোর আহ, আকর্ষণীয়। সুতরাং আমি অনুমান করি যে এখানে কোনও সমস্যা দেখা দেবে না, কারণ তিনি নামে পথে কিছু ডাকছেন, তবে এটি অন্যান্য জিনিসকে ভেঙে দেবে। ধন্যবাদ
মাইকেল মরোজেক

4

আপনি এটিকে আপনার স্ক্রিপ্টের শীর্ষে রাখতে পারেন:

cd "${BASH_SOURCE%/*}" || exit

BASH_SOURCE অভ্যন্তরীণ ব্যাশ ভেরিয়েবল আসলে পথের নামের একটি অ্যারে। আপনি যদি এটিকে একটি সাধারণ স্ট্রিং হিসাবে প্রসারিত করেন, যেমন "AS BASH_SOURCE", আপনি প্রথম উপাদানটি পাবেন যা বর্তমানে সম্পাদনকারী ফাংশন বা স্ক্রিপ্টের পথের নাম।

সূত্র: http://mywiki.wooledge.org/BashFAQ/028


2

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

SCRIPTDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )

যা এ পর্যন্ত ভাল কাজ করেছে। আমি জানতে চাই যে পদ্ধতির সাথে কোনও সম্ভাব্য সমস্যা আছে কিনা।


1
ভাল, কিন্তু symlinks অনুসরণ করে না। এটি চেষ্টা করুন:SCRIPT_DIR="$( cd "$(dirname "$( readlink -f ${BASH_SOURCE[0]} )")" >/dev/null 2>&1 && pwd)"
অরননাভন

1

আমি ব্যবহার করি:

#! /bin/sh -
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P) || exit
dosomethingwith "${dir%/}/some-file"

কোনটি পসিক্স এবং ততক্ষণ কাজ করা উচিত যতক্ষণ না ডায়ালনামটি $0নতুন লাইনের অক্ষরগুলিতে শেষ হয় না, সেট করা থাকে না -এবং $CDPATHসেট করা হয় না (এবং সম্ভবত স্ক্রিপ্টটি সন্ধান না করা থাকলে অন্য কয়েকটি কোণার কেস$PATH )।


0

আমি সর্বদা whichPATH থেকে কোনও এক্সিকিউটেবলের পুরো পথটি খুঁজে পেতে ব্যবহার করি । এই ক্ষেত্রে:

which python

আপনি যদি dirnameকমান্ডের সাথে এটি একত্রিত করেন তবে আপনি পাবেন:

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