বাশ এ চালানোর জন্য এক্সিকিউটেবল বা স্ক্রিপ্ট নামের আগে আপনার কেন। / (ডট-স্ল্যাশ) দরকার?


288

ব্যাশে স্ক্রিপ্টগুলি চালানোর সময়, আমাকে ./শুরুতে লিখতে হবে :

$ ./manage.py syncdb

যদি আমি না করি তবে আমি একটি ত্রুটি বার্তা পেয়েছি:

$ manage.py syncdb
-bash: manage.py: command not found

এটার কারণ কি? আমি ভেবেছিলাম .বর্তমান ফোল্ডারের জন্য একটি নাম এবং তাই এই দুটি কল সমতুল্য হওয়া উচিত।

./অ্যাপ্লিকেশন চালানোর সময় কেন আমার প্রয়োজন হয় না তা আমি বুঝতে পারি না , যেমন:

user:/home/user$ cd /usr/bin
user:/usr/bin$ git

(যা ছাড়া চলে ./)


4
আমি এখন পর্যন্ত যে বিষয়টি নিয়ে এসেছি তার এটি সেরা দস্তাবেজ: linfo.org/dot_slash.html
অদ্ভুততা

উত্তর:


305

কারণ ইউনিক্সে, সাধারণত, বর্তমান ডিরেক্টরিটি নেই $PATH

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

সেই তালিকায় বর্তমান ডিরেক্টরি না থাকার কারণটি হ'ল সুরক্ষা।

ধরা যাক আপনি মূল এবং অন্য ব্যবহারকারীর ডিরেক্টরিতে যান এবং slপরিবর্তে টাইপ করুন ls। যদি বর্তমান ডিরেক্টরিটি থাকে PATH, শেলটি slসেই ডিরেক্টরিতে প্রোগ্রামটি চালানোর চেষ্টা করবে (যেহেতু অন্য কোনও slপ্রোগ্রাম নেই)। এই slপ্রোগ্রামটি দূষিত হতে পারে।

এটি দিয়ে কাজ করে ./কারণ পসআইএক্স উল্লেখ করে যে একটি কমান্ডের নাম রয়েছে যাতে /একটি অনুসন্ধান দমন করে সরাসরি ফাইলের নাম হিসাবে ব্যবহৃত হবে $PATH। আপনি ঠিক একই প্রভাবের জন্য পুরো পাথটি ব্যবহার করতে পারতেন তবে ./ছোট এবং লিখতে সহজ।

সম্পাদনা

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


47
আপনার কোনও কিছুর ভুল টাইপ করার দরকার নেই। ব্যবহারকারীর সবেমাত্র একটি দূষিত প্যাকেজ ডাউনলোড করা আছে যাতে এটিতে একটি lsএক্সিকিউটেবল থাকে ।
জুলিয়ানো

13
এটি বলার জন্য কেবল একটি নোট কেবল ইউনিক্সে এবং উইন্ডোজে নয়, .\my.bat
পাওয়ারশেলের

1
@ গ্রেয়ার ইরগ, আমি বলেছিলাম "একটি উরফ নয়", যখন এটি "কঠোরভাবে একটি উপনাম" হওয়া উচিত ছিল।
চার্লস ডাফি

4
এটি একটি খুব সহায়ক ব্যাখ্যা ছিল। 20+ বছর আগে যখন আমি ডসের সাথে কিছুটা কাজ করেছি, আমি মনে করি সিএমডি বর্তমান ডিরেক্টরিটি পরীক্ষা করবে, তত্কালীন একটি পথ, সুতরাং লিনাক্সের আচরণটি আমার প্রত্যাশা মতো ছিল না, তবে এটি প্রচুর অর্থবোধ করে।
TecBrat

2
@ কনিকুতার: মজার ব্যাপার হল আজ আমি দেখতে পেলাম যে একটি sl
স্ট্যান্ড স্টোর

51

যখন বাশ কমান্ড লাইনের ব্যাখ্যা করে, এটি পরিবেশের পরিবর্তনশীলে বর্ণিত অবস্থানগুলিতে কমান্ড সন্ধান করে $PATH। এটি দেখতে টাইপ করুন:

echo $PATH

আপনার কিছু পাথ কলোন দ্বারা পৃথক করা হবে। আপনি দেখতে পাবেন যে বর্তমান পথটি .সাধারণত হয় না $PATH। সুতরাং বাশ আপনার নির্দেশটি সন্ধান করতে পারে না এটি যদি বর্তমান ডিরেক্টরিতে থাকে। আপনি এটি রেখে এটি পরিবর্তন করতে পারেন:

PATH=$PATH:.

এই লাইনটি বর্তমান ডিরেক্টরিটি যুক্ত করে $PATHযাতে আপনি এটি করতে পারেন:

manage.py syncdb

এটির সুরক্ষা সমস্যা হওয়ায় এটি প্রস্তাবিত নয় , এছাড়াও আপনি .যে ডিরেক্টরিতে রয়েছেন তার পরিবর্তে আপনার কাছে অদ্ভুত আচরণ থাকতে পারে :)

এড়াতে:

PATH=.:$PATH

আপনি কিছু স্ট্যান্ডার্ড কমান্ড "মুখোশ" দিতে এবং সুরক্ষা লঙ্ঘনের দরজা খুলতে পারেন :)

শুধু আমার দুই সেন্ট।


42

আপনার স্ক্রিপ্টটি যখন আপনার হোম ডিরেক্টরিতে থাকবে তখন শেলটি যখন $PATHআপনার স্ক্রিপ্টটি খুঁজতে পরিবেশের পরিবর্তনশীলটি দেখবে তখন তা খুঁজে পাওয়া যাবে না ।

./বলেছেন 'বদলে আমার স্ক্রিপ্টের জন্য বর্তমান ডিরেক্টরির মধ্যে চেহারা সব ডিরেক্টরি উল্লেখিত দিকে তাকিয়ে $PATH


5

আপনি যখন অন্তর্ভুক্ত করবেন '।' আপনি কার্যকরভাবে এক্সিকিউটেবল বাশ স্ক্রিপ্টকে "সম্পূর্ণ পথ" দিচ্ছেন, সুতরাং আপনার শেলটি আপনার PATH ভেরিয়েবলটি পরীক্ষা করার প্রয়োজন হবে না। ছাড়া '.' আপনার শেলটি আপনার পাথের ভেরিয়েবলটি দেখতে পাবেন (যা আপনি echo $PATHলিখেছেন তা পাঠানোর মাধ্যমে আপনি দেখতে পাচ্ছেন যে আপনার প্যাথের যে কোনও ফোল্ডারে টাইপ করা আদেশ রয়েছে it এটি যদি না হয় (যেমন ম্যানেজ.পিপি-র ক্ষেত্রে হয় না) তবে এটি এটি বলে says ফাইলটি খুঁজে পাচ্ছে না your আপনার PATH- র বর্তমান ডিরেক্টরিটি অন্তর্ভুক্ত করা খারাপ অভ্যাস হিসাবে বিবেচিত হয়, যা এখানে যথাযথভাবে ব্যাখ্যা করা হয়েছে: http://www.faqs.org/faqs/unix-faq/faq/part2/section- 13.html


2

উইন্ডোজ থেকে পৃথক * নিক্সে, বর্তমান ডিরেক্টরিটি সাধারণত আপনার $PATHচলকটিতে থাকে না । সুতরাং কমান্ডগুলি কার্যকর করার সময় বর্তমান ডিরেক্টরি অনুসন্ধান করা হয় না। আপনি প্রয়োজন হবে না ./কারণ এই অ্যাপ্লিকেশনগুলি অ্যাপ্লিকেশন চালানোর জন্য হয় আপনার $ PATH- এ; সম্ভবত তারা হয় /binবা /usr/bin


1

এই প্রশ্নের ইতিমধ্যে কয়েকটি দুর্দান্ত উত্তর রয়েছে, তবে আমি এটি যুক্ত করতে চেয়েছিলাম, যদি আপনার নির্বাহী পাঠক পদে থাকে এবং আপনি যখন চালান তখন আপনি খুব আলাদা আউটপুট পান

./executable

আপনি যদি রান করেন তবে তাদের কাছে

executable

(আসুন আমরা বলি যে আপনি একটির সাথে ত্রুটি বার্তাগুলি চালিয়েছেন এবং অন্যটি নয়), তবে সমস্যাটি হতে পারে আপনার মেশিনে এক্সিকিউটেবলের দুটি ভিন্ন সংস্করণ রয়েছে: একটি পথের দিকে, এবং অন্যটি নয়।

চালিয়ে এটি পরীক্ষা করুন

যা কার্যকর

এবং

whereis executable

এটি আমার সমস্যাগুলি স্থির করেছে ... আমার কাছে এক্সিকিউটেবলের তিনটি সংস্করণ ছিল, যার মধ্যে একটি মাত্র পরিবেশের জন্য সঠিকভাবে সংকলিত হয়েছিল।


0

/POSIX PATH বিধি জন্য যুক্তি

নিয়মটি এখানে উল্লেখ করা হয়েছিল: বাশ এ চালানোর জন্য এক্সিকিউটেবল বা স্ক্রিপ্ট নামের আগে আপনার কেন ./ (ডট-স্ল্যাশ) দরকার? তবে আমি কেন ব্যাখ্যা করি যে আমি কেন এটি বিশদভাবে একটি ভাল ডিজাইন মনে করি।

প্রথমত, নিয়মের একটি স্পষ্ট পূর্ণ সংস্করণ হ'ল:

  • পথ থাকে /(যেমন ./someprog, /bin/someprog, ./bin/someprog): CWD ব্যবহার করা হয় এবং পথ নয়
  • যদি पथ টিতে /(উদাঃ someprog) না থাকে : PATH ব্যবহৃত হয় এবং CWD হয় না

এখন, ধরুন যে চলমান:

someprog

অনুসন্ধান করবে:

  • প্রথমে সিডাব্লুডির সাথে সম্পর্কিত
  • পরে পাঠের সাথে সম্পর্কিত

তারপরে, আপনি যদি /bin/someprogনিজের ডিস্ট্রো থেকে চালাতে চান এবং আপনি তা করেছেন:

someprog

এটি কখনও কখনও কাজ করবে, তবে অন্যরা এটি ব্যর্থ হবে, কারণ আপনি হয়ত কোনও ডিরেক্টরিতে থাকতে পারেন যাতে অন্য কোনও সম্পর্কযুক্ত someprogপ্রোগ্রাম থাকে।

অতএব, আপনি শীঘ্রই শিখবেন যে এটি নির্ভরযোগ্য নয়, এবং আপনি যখন সর্বনিম্ন পথ ব্যবহার করতে চান তখন সর্বদা নিখুঁত পাথগুলি ব্যবহার করবেন, অতএব পথের উদ্দেশ্যকে পরাস্ত করবেন।

এই কারণেই আপনার পাঠাতে আপেক্ষিক পাথগুলি রাখা খুব খারাপ ধারণা। আমি তোমার দিকে তাকাচ্ছিnode_modules/bin ,।

বিপরীতে, ধরুন যে চলমান:

./someprog

অনুসন্ধান করবে:

  • প্রথমে পাঠের সাথে সম্পর্কিত
  • সিডাব্লুডির পরে আপেক্ষিক

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

/bin/someprog

গত বছরের ক্রিসমাসের পরে বেশি পরিমাণে পান করার পরে আপনি ইনস্টল করা কিছু প্যাকেজ থেকে যা আপনার মধ্যে পাঠ।

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

"$(pwd)/someprog"

যা অত্যন্ত বিরক্তিকরও হবে।

আর একটি নিয়ম যা আপনাকে সামনে আসতে প্রলোভিত হতে পারে তা হ'ল:

আপেক্ষিক পাথগুলি কেবলমাত্র PATH, পরম পাথগুলি কেবল সিডাব্লুডি ব্যবহার করে

তবে আবার এটি ব্যবহারকারীদের সর্বদা প্যাথবিহীন স্ক্রিপ্টগুলির জন্য নিখুঁত পথগুলি ব্যবহার করতে বাধ্য করে "$(pwd)/someprog"

/পথ অনুসন্ধান নিয়ম সমস্যা সম্পর্কে সমাধান মনে রাখা একটি সহজ দিচ্ছে:

  • স্ল্যাশ: ব্যবহার করবেন না PATH
  • কোনও স্ল্যাশ নেই: কেবল ব্যবহার করুন PATH

যা আপনি যা চালাচ্ছেন তা সর্বদা জেনে রাখা সহজ করে তোলে যে বর্তমান ডিরেক্টরিতে থাকা ফাইলগুলিকে ./somefileবা হিসাবে হিসাবে প্রকাশ করা যেতে পারে somefileএবং তাই এটি তাদের মধ্যে একটির বিশেষ অর্থ দেয়।

কখনও কখনও, কিছুটা বিরক্তিকর হয় যে আপনি some/progতুলনামূলকভাবে অনুসন্ধান করতে পারবেন না PATH, তবে আমি এর কোনও স্যানার সমাধান দেখতে পাচ্ছি না।


-1

যখন স্ক্রিপ্টটি পথে না থাকে তখন এটি করা দরকার। আরও তথ্যের জন্য http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html পড়ুন


5
... FYI, irc.freenode.org এর # ব্যাশে, আমরা টিএলডিপি (বিশেষত উন্নত বাশ গাইড) থেকে লোকেরা শিখেছে এমন ভুল বোঝাবুঝিগুলি ক্রমাগত সংশোধন করছি। যেমন, সেখানে লোকদের পরিচালনা করা ... সম্ভবত আদর্শ নয়। (আমাদের পছন্দের প্রারম্ভিক ডকুমেন্টেশন হ'ল মাইকিউইউউইউইলজিইউআর / বাশগুইড )
চার্লস

-2

সকলের প্রশ্নের দুর্দান্ত উত্তর রয়েছে, এবং হ্যাঁ এটি কেবলমাত্র বর্তমান ডিরেক্টরিতে চালিত করার সময়েই প্রযোজ্য যখন না আপনি নিখুঁত পাথ অন্তর্ভুক্ত করেন। আমার নমুনা নীচে দেখুন।

এছাড়াও, যখন আমি চাইল্ড ফোল্ডার টিএমপি 2 (/ tmp / tmp2) এ কমান্ড পেয়েছি এবং এটি (ডাবল ডট-স্ল্যাশ) আমার কাছে (ডট-স্ল্যাশ) উপলব্ধি করেছিল।

নমুনা:

[fifiip-172-31-17-12 tmp]$ ./StackO.sh

Hello Stack Overflow

[fifi@ip-172-31-17-12 tmp]$ /tmp/StackO.sh

Hello Stack Overflow

[fifi@ip-172-31-17-12 tmp]$ mkdir tmp2

[fifi@ip-172-31-17-12 tmp]$ cd tmp2/

[fifi@ip-172-31-17-12 tmp2]$ ../StackO.sh

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