স্ক্রিপ্টের ডিরেক্টরিতে বর্তমান চলমান ডিরেক্টরিটি কীভাবে সেট করবেন?


569

আমি একটি বাশ স্ক্রিপ্ট লিখছি। স্ক্রিপ্টটি যে ডাইরেক্টরিটির মধ্যে রয়েছে সেই ডিরেক্টরি হতে আমাকে সর্বদা চলমান ডিরেক্টরিটি প্রয়োজন।

ডিফল্ট আচরণটি হ'ল স্ক্রিপ্টের বর্তমান কার্যক্ষম ডিরেক্টরি হ'ল যে শেলটি থেকে আমি এটি চালাচ্ছি, তবে আমি এই আচরণটি চাই না।


আপনি কি (ইউএসআর / বিন) মতো কোথাও একটি (হার্ডকোডযুক্ত) যথাযথ ডিরেক্টরিতে সিডি করতে একটি র‌্যাপার স্ক্রিপ্ট স্থাপন এবং তারপরে আপনার স্ক্রিপ্টটি কার্যকর করার বিষয়টি বিবেচনা করেছেন?
দাগ নাবিত

2
আপনার স্ক্রিপ্টের ডিরেক্টরি দরকার কেন? অন্তর্নিহিত সমস্যাটি সমাধান করার সম্ভবত আরও ভাল উপায় আছে।
bstpierre

12
আমি কেবল এটিই উল্লেখ করতে চাই যে আপনি "স্পষ্টতই অবাঞ্ছিত" হিসাবে আখ্যায়িত আচরণটি সম্পূর্ণরূপে প্রয়োজনীয় - যদি আমি চালিত myscript path/to/fileকরি তবে স্ক্রিপ্টটি আমার বর্তমান ডিরেক্টরিটির সাথে সম্পর্কিত পাথ / টু / ফাইলের মূল্যায়ন করার প্রত্যাশা করব, স্ক্রিপ্টটি যে কোনও ডিরেক্টরিই ঘটবে না অবস্থিত হতে হবে Also এছাড়াও, ssh remotehost bash < ./myscriptবেস এফএকিউর উল্লেখ অনুসারে স্ক্রিপ্ট চালানোর জন্য আপনার কী হবে ?
গর্ডন ডেভিসন


3
cd "${BASH_SOURCE%/*}" || exit
কাও

উত্তর:


655
#!/bin/bash
cd "$(dirname "$0")"

7
dirname ফেরত '।' উইন্ডোজ অধীনে ব্যাশ ব্যবহার করার সময়। সুতরাং, পলের উত্তর আরও ভাল।
Tvaroh

7
ফিরে আসে '।' ম্যাক ওএসএক্স
বেন ক্লেটন

4
এটি লক্ষণীয় যে প্রতীকী লিঙ্কটি অংশ তৈরি করলে জিনিসগুলি ভেঙে যেতে পারে $0। আপনার স্ক্রিপ্টে আপনি প্রত্যাশা করতে পারেন, উদাহরণস্বরূপ, ../../স্ক্রিপ্টের অবস্থানের দুটি স্তরের উপরে ডিরেক্টরিটি উল্লেখ করুন, তবে প্রতীকী লিঙ্কগুলি খেলতে থাকলে এটি অবশ্যই প্রয়োজন না isn't
ব্রায়ান গর্ডন

20
আপনি স্ক্রিপ্ট নামক তাহলে ./script, .সঠিক ডিরেক্টরি, এবং পরিবর্তন .এটি খুব ডিরেক্টরি যেখানে শেষ হবে scriptঅবস্থিত, বর্তমান ডিরেক্টরিতে অর্থাত।
এনডিএম

6
আপনি যদি বর্তমান ডিরেক্টরি থেকে স্ক্রিপ্টটি চালাচ্ছেন bash script.shতবে এর মান $0হয় script.shcdকমান্ডটি আপনার জন্য "কাজ" করার একমাত্র উপায় হ'ল আপনি ব্যর্থ কমান্ডের বিষয়ে চিন্তা করেন না। যদি আপনার স্ক্রিপ্টটি ব্যর্থ কমান্ডগুলিকে উড়িয়ে না দেয় তা নিশ্চিত করতে আপনি যদি set -o errexit(ওরফে set -e:) ব্যবহার করেন তবে এটি কাজ করবে না কারণ cd script.shএটি একটি ত্রুটি। নির্ভরযোগ্য [বাশ নির্দিষ্ট] cd "$(dirname ${BASH_SOURCE[0]})"
উপায়টি

322

নিম্নলিখিতগুলিও কাজ করে:

cd "${0%/*}"

সিনট্যাক্সটি এই স্ট্যাকওভারফ্লো উত্তরে পুরোপুরি বর্ণিত হয়েছে ।


17
ব্যাখ্যা কিভাবে এটি কাজ করে: stackoverflow.com/questions/6393551/...
kenorb

25
যদি পথটিতে শ্বেত স্পেস থাকে তবে কোটগুলি সংযুক্ত করতে ভুলবেন না। অর্থাত্ সিডি "$ {0% / *}"
এইচ.রাবি

17
স্ক্রিপ্টটি কল করা থাকলে এটি ব্যর্থ হয় bash script.sh- $0কেবলমাত্র ফাইলটির নাম হবে
ক্রিস ওয়াটস

17
আমি বলব এই উত্তরটি খুব সংক্ষিপ্ত। আপনি সিনট্যাক্স সম্পর্কে খুব কমই শিখলেন। এটি কীভাবে পড়তে হবে সে সম্পর্কে কিছু বিবরণ সহায়ক হবে।
ফ্রেমচার

2
এই কৌশলটি একটি সাব-শেল খুব বেশি উত্পন্ন করে না তাই গতি শৌখিন্যের পক্ষে ভাল।
টেকনোপল

184

নিম্নলিখিত সাধারণ ওয়ান-লাইনার ব্যবহার করে দেখুন:


সমস্ত ইউনিক্স / ওএসএক্স / লিনাক্সের জন্য

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

সজোরে আঘাত

dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)

দ্রষ্টব্য: একটি ডাবল ড্যাশ (-) কমান্ড বিকল্পের সমাপ্তি বোঝাতে ব্যবহৃত হয়, সুতরাং ড্যাশগুলি বা অন্যান্য বিশেষ অক্ষরযুক্ত ফাইলগুলি কমান্ডটি ভাঙ্গবে না।

দ্রষ্টব্য: বাশের ${BASH_SOURCE[0]}পক্ষে , ব্যবহার করুন $0, অন্যথায় পথটি ( source/ .) উত্সাহ দেওয়ার সময় ভাঙতে পারে ।


লিনাক্স, ম্যাক এবং অন্যান্য * বিএসডি এর জন্য:

cd "$(dirname "$(realpath "$0")")";

দ্রষ্টব্য: realpathডিফল্টরূপে (উবুন্টুর মতো) সর্বাধিক জনপ্রিয় লিনাক্স বিতরণে ইনস্টল করা উচিত তবে কিছু ক্ষেত্রে এটি অনুপস্থিত হতে পারে, তাই আপনাকে এটি ইনস্টল করতে হবে।

দ্রষ্টব্য: আপনি যদি ব্যাশ ব্যবহার ${BASH_SOURCE[0]}করছেন তবে তার পক্ষে ব্যবহার করুন $0, অন্যথায় পথটি ( source/ .) স্রোস করার সময় ভেঙে যেতে পারে ।

অন্যথায় আপনি এরকম কিছু চেষ্টা করতে পারেন (এটি প্রথম বিদ্যমান সরঞ্জামটি ব্যবহার করবে):

cd "$(dirname "$(readlink -f "$0" || realpath "$0")")"

লিনাক্স নির্দিষ্ট জন্য:

cd "$(dirname "$(readlink -f "$0")")"

* বিএসডি / ম্যাকের উপর জিএনইউ রিডলিঙ্ক ব্যবহার:

cd "$(dirname "$(greadlink -f "$0")")"

দ্রষ্টব্য: আপনার coreutilsইনস্টল থাকা দরকার (যেমন 1. হোমব্রিউ ইনস্টল করুন , ২ brew install coreutils)।


ব্যাশে

বাশে আপনি এটি অর্জনের জন্য প্যারামিটার বিস্তৃতি ব্যবহার করতে পারেন , যেমন:

cd "${0%/*}"

তবে স্ক্রিপ্ট একই ডিরেক্টরি থেকে চালিত হলে এটি কাজ করে না।

বিকল্পভাবে আপনি নিম্নলিখিত ফাংশনটিকে ব্যাশে সংজ্ঞায়িত করতে পারেন:

realpath () {
  [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
}

এই ফাংশনটি 1 টি যুক্তি লাগে। যদি যুক্তিটির ইতিমধ্যে পরম পাথ থাকে, তবে এটি ঠিক একইভাবে মুদ্রণ করুন, অন্যথায় $PWDভেরিয়েবল + ফাইলনাম যুক্তি ( ./উপসর্গ ব্যতীত) মুদ্রণ করুন ।

বা এখানে ডেবিয়ান .bashrcফাইল থেকে নেওয়া সংস্করণটি রয়েছে :

function realpath()
{
    f=$@
    if [ -d "$f" ]; then
        base=""
        dir="$f"
    else
        base="/$(basename "$f")"
        dir=$(dirname "$f")
    fi
    dir=$(cd "$dir" && /bin/pwd)
    echo "$dir$base"
}

সম্পর্কিত:

আরো দেখুন:

আমি কীভাবে ম্যাকের সাথে জিএনইউ'র রিডলিংক-এর আচরণ পেতে পারি?


4
জনপ্রিয়গুলির তুলনায় আরও ভাল উত্তর কারণ এটি সিস্টেঙ্কগুলি সমাধান করে এবং বিভিন্ন ওএস এর জন্য অ্যাকাউন্ট করে। ধন্যবাদ!
ডেনিস

এই উত্তরের জন্য ধন্যবাদ। শীর্ষস্থানীয়টি আমার ম্যাকে কাজ করেছে ... তবে - সুইচ cpকমান্ডটিতে কী করবে, @ কেনরব?
টবিজি

3
--কমান্ড বিকল্পগুলির শেষ বোঝাতে কমান্ডগুলিতে একটি ডাবল ড্যাশ ( ) ব্যবহৃত হয়, সুতরাং ড্যাশগুলি বা অন্যান্য বিশেষ অক্ষরযুক্ত ফাইলগুলি কমান্ডটি ভাঙ্গবে না। যেমন করে দেখুন মাধ্যমে ফাইল তৈরি touch "-test"এবং touch -- -testতারপর, মাধ্যমে ফাইলটি সরান rm "-test"এবং rm -- -test, এবং পার্থক্য দেখুন।
কেনারব

1
আমি যদি পারতাম তবে আমি আমার উচ্ছেদটি সরিয়ে ফেলব: রিয়েলপথ অবচিত হয়েছে unix.stackexchange.com/questions/136494/…
lsh

1
@ ল্যাশ এটি বলছে যে কেবলমাত্র দেবিয়ান realpathপ্যাকেজ হ'ল জিএনইউ নয় realpath। আপনি যদি মনে করেন এটি পরিষ্কার নয়, আপনি একটি সম্পাদনার পরামর্শ দিতে পারেন।
কেনোরব

73
cd "$(dirname "${BASH_SOURCE[0]}")"

এটি সহজ. এটা কাজ করে।


1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। ওএসএক্স এবং লিনাক্স উবুন্টুতে কাজ করে।
ডেভিড রিসাতো ক্রুজ

5
স্ক্রিপ্ট বিটি অন্যান্য স্ক্রিপ্ট এ থেকে উত্সাহিত হয় এবং এটি স্ক্রিপ্ট বি এর সাথে সম্পর্কিত পাথগুলি ব্যবহার করা দরকার, এটি দুর্দান্ত কাজ করে Thank
এনরিকো

5
এটি সাইগউইনে আমাদের যারা উইন্ডোজ স্পর্শ করার জন্য যথেষ্ট দুর্ভাগ্যজনক তাদের জন্যও কাজ করে ।
ব্রুনো ব্রোনোস্কি

3
বাcd "${BASH_SOURCE%/*}" || exit
কাও


6

গৃহীত উত্তরপত্রে, এই ধরনের যত যে অন্যত্র সিমলিঙ্ক হয়নি জন্য ভাল কাজ করে $PATH

#!/bin/bash
cd "$(dirname "$0")"

তবে স্ক্রিপ্টটি যদি কোনও সিমলিংকের মাধ্যমে চালিত হয়,

ln -sv ~/project/script.sh ~/bin/; 
~/bin/script.sh

এটি ~/bin/ডিরেক্টরিতে নয়, ~/project/ডিরেক্টরিতে সিডি করবে যা সম্ভবত আপনার স্ক্রিপ্টটি ভেঙে দেবে যদি উদ্দেশ্য হয়cd নির্ভর করে নির্ভরতা অন্তর্ভুক্ত করা~/project/

সিমলিংক নিরাপদ উত্তর নীচে:

#!/bin/bash
cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"

readlink -f সম্ভাব্য সিমলিঙ্কযুক্ত ফাইলটির নিখুঁত পথটি সমাধান করার জন্য প্রয়োজনীয়।

কোয়েটগুলি ফাইলপথগুলিকে সমর্থন করার জন্য প্রয়োজনীয় যা হোয়াইটস্পেস থাকতে পারে (খারাপ অভ্যাস, তবে এটি নিরাপদ নয় এটি ধরে নেওয়া যায় না)


4

এই লিপিটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে:

#!/bin/bash
mypath=`realpath $0`
cd `dirname $mypath`
pwd

Pwd কমান্ড লাইনটি স্ক্রিপ্টের অবস্থানটি বর্তমান ওয়ার্কিং ডিরেক্টরি হিসাবে প্রতিধ্বনিত করেই আমি এটি চালনা করি না কেন।


3
realpathসর্বত্র ইনস্টল করার সম্ভাবনা নেই। ওপির অবস্থার উপর নির্ভর করে যা কোনও বিষয় নয়।
bstpierre

আমার সিস্টেমে নেই realpathতবে এটির readlinkমতো রয়েছে বলে মনে হচ্ছে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

2
ডিফল্টরূপে কোন জেলাতে রিয়েলপথ ইনস্টল করা হয়নি? উবুন্টু এটা আছে।
কেনারব


1
cd "`dirname $(readlink -f ${0})`"

আপনি আপনার উত্তর ব্যাখ্যা করতে পারেন দয়া করে?
জুলু

1
যদিও এই কোডটি সমস্যা সমাধানে সহায়তা করতে পারে তবে এটি কেন এবং / বা কীভাবে প্রশ্নের উত্তর দেয় তা ব্যাখ্যা করে না । এই অতিরিক্ত প্রসঙ্গ সরবরাহ করা তার দীর্ঘমেয়াদী শিক্ষাগত মানকে উল্লেখযোগ্যভাবে উন্নতি করবে। দয়া করে সম্পাদনা ব্যাখ্যা যোগ করার জন্য সহ সীমাবদ্ধতা এবং অনুমানের কি প্রয়োগ আপনার উত্তর।
টবি স্পিড

-5
echo $PWD

পিডব্লিউডি একটি পরিবেশের পরিবর্তনশীল।


5
এটি কেবল ডিরেক্টরিটি কল করেছিল, যেখানে স্ক্রিপ্ট রয়েছে সেই ডিরেক্টরিটি নয়।
ডেজল্ফ

-6

আপনার যদি কেবল উপস্থিত কার্যক্ষম ডিরেক্টরি মুদ্রণ করতে হয় তবে আপনি এটি অনুসরণ করতে পারেন।

$ vim test

#!/bin/bash
pwd
:wq to save the test file.

কার্যকর করার অনুমতি দিন:

chmod u+x test

তারপরে স্ক্রিপ্টটি কার্যকর করুন ./testআপনি বর্তমান কার্যক্ষম ডিরেক্টরিটি দেখতে পাবেন।


2
প্রশ্নটি ছিল কীভাবে স্ক্রিপ্টটি তার নিজস্ব ডিরেক্টরিতে চালিত হয় তা নিশ্চিত করার জন্য , যদি এটি কার্যকরী ডিরেক্টরি না হয় including সুতরাং এটি কোনও উত্তর নয়। যাইহোক, শুধু ... চালানোর পরিবর্তে এটি কেন করবেন pwd? আমার কাছে অনেকটা নষ্ট কিপ্রেসের মতো মনে হচ্ছে।
আন্ডারস্কোর_
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.