বর্তমান ডিরেক্টরিতে কোনও প্রোগ্রাম চালানোর আগে আমাকে `। / Type টাইপ করতে হবে কেন?


92

a.outউবুন্টু টার্মিনালটি ব্যবহার করে একটি সি প্রোগ্রাম চালানোর সময় , কেন আমি সবসময় কেবল লেখার পরিবর্তে ./আগে টাইপ করা দরকার ? এর কোন সমাধান আছে কি?a.outa.out



ইউনিক্স সম্পর্কিত সম্পর্কিত প্রশ্ন.এসই কেন আমরা একটি ফাইল চালাতে "./" ডট স্ল্যাশ ব্যবহার করব?
ইভান চৌউ

উত্তর:


119

আপনি যখন কোনও প্রোগ্রামের নাম টাইপ করেন তখন a.outসিস্টেম আপনার PATH এ ফাইলটি সন্ধান করে। আমার সিস্টেমে, PATH সেট করা আছে

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

আপনার সম্ভবত একই রকম। পরীক্ষা করতে, echo $PATHএকটি টার্মিনালে প্রবেশ করুন ।

সিস্টেমটি এই ডিরেক্টরিগুলি প্রদত্ত ক্রমের মাধ্যমে দেখে এবং যদি এটির সন্ধান না করে তবে প্রোগ্রামটি একটি command not foundত্রুটি তৈরি করে ।

./কার্যকরভাবে কমান্ডটি প্রস্তুত করাতে "PATH সম্পর্কে ভুলে যান, আমি চাই আপনি কেবল বর্তমান ডিরেক্টরিতে দেখবেন" says

একইভাবে আপনি কোনও আপেক্ষিক বা পরম পথে যেমন কমান্ডটি প্রিন্ট করে সিস্টেমটিকে কেবল একটি নির্দিষ্ট নির্দিষ্ট অবস্থান অনুসন্ধান করতে বলতে পারেন:

../অভিভাবক ডিরেক্টরিতে অর্থাত্ পিতামহিত ডিরেক্টরিতে ../helloহ্যালো অনুসন্ধান করুন।

./Debug/hello: " helloআমার বর্তমান ডিরেক্টরিটির ডিবাগ সাব-ডিরেক্টরিতে সন্ধান করুন।"

বা /bin/ls: " lsডিরেক্টরিতে সন্ধান করুন /bin"

ডিফল্টরূপে, বর্তমান ডিরেক্টরিটি পথে নেই কারণ এটি একটি সুরক্ষা ঝুঁকি হিসাবে বিবেচিত। কেন হয় দেখুন ডিফল্ট পথে না? কেন সুপারزر উপর।

আপনার पथপথের সাথে বর্তমান ডিরেক্টরি যুক্ত করা সম্ভব, তবে লিঙ্কযুক্ত প্রশ্নে দেওয়া কারণগুলির জন্য, আমি এটি সুপারিশ করব না।


25
এই. +1 এই উত্তরে উল্লিখিত সুরক্ষা ঝুঁকির কারণে আপনার (2 টি উত্তর হিসাবে বর্তমানে প্রস্তাবিত হিসাবে) যুক্ত করবেন না.PATH
দিন

8
এরও কোন মূল্য নেই মূল্য সম্পর্কে বিশেষ কিছুই নেই যে হতে পারে .এখানে, আপনি একটি এক্সিকিউটেবল যেমন একটি পূর্ণ বা আপেক্ষিক পাথ ব্যবহার করতে পারেন /home/user/foo/a.outবা./build/a.out
tobyodavies

@tobyodavies; প্রকৃতপক্ষে .বিশেষ কারণ এটি "আমার বর্তমান ডিরেক্টরি" এর অর্থ এমন কোনও ডিরেক্টরি হতে পারে যা ব্যবহারকারীরা তাদের পড়ার এবং অধিকারগুলি কার্যকর করার সাথে সাথে আবিষ্কার করে। এটি একটি নির্দিষ্ট সম্পূর্ণরূপে যোগ্য পাথ যোগ করার চেয়ে সম্ভাব্য আরও বিপজ্জনক।
ওয়ারেন হিল

@ ওয়ারেনহিল এটি আপনার পথে যুক্ত করার বিষয়ে বিবেচনা করার সময় হ্যাঁ এটি একেবারেই আলাদা। তবে ব্যাশ সিনট্যাক্সের ক্ষেত্রে, .কোনও বিশেষ মর্যাদা নেই, এটি কেবল একটি পথ যা কেবল শুরু হতে পারে /এবং ব্যাশ প্রম্পটের ./blahসাথে catবা ঠিক পাশাপাশি কাজ করবে grep
tobyodavies

@ টোবায়ডাভিজ: ঠিক আছে আমি আপনার উত্তরটি যুক্ত করতে আমার উত্তরটি সম্পাদনা করেছি।
ওয়ারেন হিল

24

এটার কারন খুবিই সাধারন.

ধরুন আপনার বর্তমান ডিরেক্টরিতে অ্যাপ্লিকেশন হিসাবে একই নামের একটি কমান্ড রয়েছে। তারপরে শেলের মধ্যে কমান্ডটি চালানো বিল্ট-ইন কমান্ডের পরিবর্তে আপনার অ্যাপ্লিকেশনটি শুরু করবে । এটি অন্য কোনও কিছু না হলে এটি সুরক্ষা উদ্বেগের বিষয়।

./সামনে ব্যবহারের প্রয়োজনের দ্বারা , শেলটি জানে যে আপনি প্রদত্ত নামের সাথে অ্যাপ্লিকেশনটি চালাতে চান এবং সেই নামের কোনও বিল্ট-ইন কমান্ড নয়।


1
আপনার ব্যাখ্যাটি বিভ্রান্তিমূলক, শেলটিতে বিল্ট-ইন কমান্ড এবং PATH ভেরিয়েবলের মাধ্যমে অ্যাক্সেসযোগ্য এক্সিকিউটেবলের মধ্যে পার্থক্য রয়েছে। প্রকৃতপক্ষে আপনার উত্তরটি আমি যত বেশি পড়ি তত বেশি ভুল অনুভব করে।
আহমেদ মাসুদ

16

./আপনার মধ্যে নেই এমন ফাইলগুলি কার্যকর করে $PATH, বরং এটি বর্তমান ডিরেক্টরিতে (বা অন্য কোনও মাধ্যমে ./home/stefano/script.sh) ফাইল চালায় । এখন, PATH একটি পরিবেশের পরিবর্তনশীল যা ব্যাশ তাদের সম্পূর্ণ (পরম) পথ ছাড়াই এক্সিকিউটেবল প্রোগ্রামের সন্ধান করতে পারে এমন সমস্ত জায়গাগুলি ধারণ করে।

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

  • আপনি যখন কোনও কমান্ড চালনা করেন বা কোনও প্রোগ্রাম একটি execসিস্কল তৈরি করার চেষ্টা করে (কার্নেলের একটি বিশেষ পদ্ধতি, প্রোগ্রামগুলি কীভাবে শুরু হয়) সিস্টেম আপনার প্যাথের প্রতিটি ডিরেক্টরিতে গিয়ে ফাইলটি সন্ধান করে। প্রোগ্রামটি একবারে সন্ধান করা হলেও এটি একাধিক ডিরেক্টরিতে থাকলেও অনুসন্ধানটি ব্যাহত হয় এবং পাওয়া প্রথমটিটি চালিত হয়।

একটি ফাইল চালাতে, আপনাকে অনুমতিগুলিতে এক্সিকিউটেবল বিট সেট করতে হবে:

  • যেহেতু আপনি ইতিমধ্যে কমান্ড লাইনে রয়েছেন, আপনি কেবল টাইপ করতে পারেন chmod +x finename

  • অথবা আপনি কি সঠিক ফাইল ক্লিক করে এবং নির্বাচন করে অনুমতি সেট করতে পারেন প্রোপার্টি :

    বিকল্প পাঠ

আপনি এখন PATH এর যে কোনও ডিরেক্টরিতে ফাইলটি অনুলিপি করতে পারেন, কোনটি সেখানে রয়েছে তা দেখার জন্য - এবং সেগুলি প্রতি ব্যবহারকারীর ভিত্তিতে টাইপ করা হয়েছে - টাইপ করুন echo $PATH

stefano@3000-G530:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

আপনি যদি একটি এক্সিকিউটেবল ফাইল তৈরি করেন catএবং এটিকে সরিয়ে নিয়ে যান তবে /usr/local/sbinএটি যথাযথ পরিবর্তে চালিত হয় catযা এতে থাকে /bin। আপনার ফাইলগুলি কোথায় type catএবং ব্যবহার করে তা খুঁজে পেতে পারেন whereis cat


2
একটি বিষয় লক্ষণীয়: তাঁর প্রশ্নটি ইঙ্গিত দেয় যে সে এমন কিছু সংকলন করেছে এবং এর সাথে লিঙ্ক করেছে gcc, যা স্বয়ংক্রিয়ভাবে এক্সিকিউট বিট সেট করে।
নাথান ওসমান

12

./প্রোগ্রাম চালানোর আগে আপনাকে কেন টাইপ করতে হবে ?

টার্মিনালে, যখনই আপনি কোনও অ্যাপ্লিকেশনটির নাম টাইপ করেন, আসুন আমরা বলি geditযে টার্মিনালটি অ্যাপ্লিকেশনগুলি (অ্যাপ্লিকেশনগুলির বাইনারি) ধারণ করে এমন কিছু (পূর্বনির্ধারিত) ডিরেক্টরিতে যাবে। এই ডিরেক্টরিগুলির নামগুলি একটি পরিবর্তনশীল বলা হয় PATH। এক্সিকিউট করে আপনি এই ভেরিয়েবলটিতে কী দেখতে পাচ্ছেন echo $PATH। এই ডিরেক্টরিগুলি দ্বারা বিভক্ত দেখুন :? সেই ডিরেক্টরি যে টার্মিনাল, অনুসন্ধান যদি আপনি শুধু টাইপ যেতে হবে gedit, nautilusঅথবা a.out। আপনি দেখতে পাচ্ছেন, আপনার a.outপ্রোগ্রামের পথটি নেই। আপনি যখন করবেন ./a.out, আপনি টার্মিনালটি বলছেন "বর্তমান ডিরেক্টরিটি দেখুন, এবং চালান a.out, এবং ভিতরে যান না PATH

সমাধান 1

আপনি যদি ./প্রতিবার টাইপ করতে না চান তবে আপনাকে a.outডিরেক্টরিটি যুক্ত করতে হবে $PATH। নিম্নলিখিত নির্দেশাবলী, আমি যে পথে অনুমান করব a.outহয় /path/to/programs/, কিন্তু আপনি আপনার প্রকৃত পথে এটি পরিবর্তন করা উচিত নয়।

  1. কেবল ফাইলের শেষে নিম্নলিখিত লাইনটি যুক্ত করুন ~/.pam_environment:

    PATH DEFAULT=${PATH}:/path/to/programs

    উত্স: অবিরাম পরিবেশ পরিবর্তনশীল

  2. লগ আউট এবং লগ ইন করুন You আপনি এখন কোনও ডিরেক্টরি a.outছাড়াই চালাতে সক্ষম হবেন ./

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

সমাধান 2

দ্রষ্টব্য:userName আপনার প্রকৃত উবুন্টু ব্যবহারকারীর নাম পরিবর্তন করুন ।

আপনি যদি চালাতে চান এমন অন্যান্য প্রোগ্রাম থাকে তবে কী হবে? এবং তারা সব কি বিভিন্ন ফোল্ডারে আছে? ভাল, একটি "আরও সুসংহত" সমাধান binহ'ল আপনার হোম ডিরেক্টরি অনুসারে একটি ফোল্ডার তৈরি করা এবং সেই ফোল্ডারের অধীনে প্রতীকী লিঙ্কগুলি (শর্টকাট) যুক্ত করা। এখানে কীভাবে:

  1. mkdir /home/userName/bin

    • এটি binআপনার হোম ডিরেক্টরিতে ফোল্ডারটি তৈরি করবে ।
  2. ln -s /path/to/programs/a.out /home/userName/bin

    • এটি আপনার a.outপ্রোগ্রামের আওতায় একটি "প্রতীকী লিঙ্ক" (মূলত একটি শর্টকাট) তৈরি করবে bin
  3. লগ আউট এবং লগ ইন করুন You আপনি এখন কোনও ডিরেক্টরি a.outছাড়াই চালাতে সক্ষম হবেন ./

এখন, যখনই আপনার অন্য কোথাও অন্য প্রোগ্রাম রয়েছে, আসুন b.inআপনার ডেস্কটপে প্রোগ্রামটি বলুন , আপনাকে যা করতে হবে তা হ'ল: ln -s /home/userName/Desktop/b.in /home/userName/binএবং তারপরে আপনি এটি ছাড়াও এটি চালাতে সক্ষম হবেন ./

দ্রষ্টব্য: @ জো এর মন্তব্যে ধন্যবাদ , আপনি যখন ব্যাকআপ করেন, প্রতীকী লিঙ্কগুলি বিশেষভাবে পরিচালনা করতে হয়। ডিফল্টরূপে, rsyncএগুলি মোটেই প্রসেস করবেন না, সুতরাং যখন আপনি পুনরুদ্ধার করবেন তখন তারা সেখানে থাকেন না।


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

1

জর্জ তার উত্তরে যেমন উল্লেখ করেছেন, এটি আপনাকে নোট করতে সহায়তা করে যে আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিতে ( ) ডিরেক্টরি ফাইল চালাচ্ছে apwd

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

তবে ব্যক্তিগতভাবে আমি এর বিরুদ্ধে সুপারিশ করব এটি আমার কাছে কখনও ঘটেনি, তবে আপনি যদি এলিয়েন নেটওয়ার্ক ডিরেক্টরি বা অন্য কোনও কিছুতে থাকেন এবং একটি দূষিত নির্বাহযোগ্য ফাইল নামে পরিচিত lsসেখানে উপস্থিত হন, তবে .আপনার পথে থাকা খুব খারাপ ধারণা। আপনি এই সমস্যাটি খুব প্রায়ই চালিয়ে যাবেন না, কেবল বলছেন।


ঠিক আছে, স্টিফানো এই তথ্যটি ধারণ করতে তার উত্তর গ্রহণ করেছিল :)
শ্রীকান্ত শরৎ

3
আমি সম্পূর্ণভাবে যোগ না তার সাথে একমত .করতে $PATH। খুব বিপজ্জনক ধারণা।
নাথান ওসমান

1

অন্যান্য উত্তরের পাশাপাশি, এখানে প্রয়োজনীয় অংশটি man bashযা থেকে এটি ভালভাবে ব্যাখ্যা করা হয়েছে:

আদেশ এক্সিকিউশন
       কোনও কমান্ড শব্দের মধ্যে বিভক্ত হয়ে যাওয়ার পরে যদি এর ফলাফলটি একটি সাধারণ হয়
       কমান্ড এবং যুক্তিগুলির একটি alচ্ছিক তালিকা, নিম্নলিখিত ক্রিয়াগুলি
       নিয়ে যাওয়া হয়।

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

       নামটি শেল ফাংশন বা বিল্টিন না থাকলে এবং এতে কোনও নেই
       স্ল্যাশ করে, ব্যাশ ডিরেক্টরি কনসের জন্য প্যাথের প্রতিটি উপাদান অনুসন্ধান করে
       এই নামে একটি এক্সিকিউটেবল ফাইল টেনিং।

0

এ './' অর্থপূর্ণ হয় যখন আপনি এমন কোনও প্রোগ্রাম পরিচালনা করেন যা আপনার জন্য নির্দিষ্ট এবং নির্দিষ্ট, যেমন আপনার নিজস্ব own এই প্রোগ্রামটি অবশ্যই আপনার বর্তমান ডিরেক্টরিতে উপস্থিত থাকতে হবে। আপনি 'স্ট্যাথের কোথাও কোথাও রয়েছে এমন কোনও স্ট্যান্ডার্ড কমান্ড চালালে কোনও' ./ 'কোনও অর্থবোধ করে না। একটি আদেশ যা "কমান্ড-টু-রান" আপনাকে জানায় যে command PATH-তে কমান্ড-থেকে-রান রয়েছে।


0
$ gcc hello.c -o /path/to/someplace/hello

কিছু স্থানে এক্সিকিউটেবল উত্পাদন করে। যদি সেই অবস্থানটি আপনার পথে থাকে তবে আপনি ফাইলটি চালাতে সক্ষম হবেন। আপনি যদি এই ক্রিয়াটির জন্য একটি লেবেল তৈরি করতে চান "জিসিসি ব্যবহার করে এই উত্স কোডটি সংকলন করুন এবং আপনার পথে যে কোনও স্থানে এক্সিকিউটেবল স্থাপন করুন" আপনি এই স্ক্রিপ্টটি করতে পারেন

আমি আপনাকে "টেস্টবিন" নামক একটি নতুন ডিরেক্টরি বা সেই জাতীয় কিছু তৈরি করার পরামর্শ দিচ্ছি এবং এটি আপনার বিদ্যমান পাথ ডিরেক্টরিগুলি পরিষ্কার রাখার জন্য আপনার পথে রাখার পরামর্শ দিচ্ছি।


0

./কোনও পথের জন্য অপ্রয়োজনীয় অনুসন্ধান সরিয়ে দেয়। ./কেবলমাত্র বর্তমান ডিরেক্টরিতে অনুসন্ধান করতে বাধ্য করুন। আমরা যদি দিতে না ./তারপর, এটা বিভিন্ন পাথ সিস্টেম মত মধ্যে নির্ধারণ অনুসন্ধান করবে /usr/bin, /usr/sbin/ইত্যাদি


0

"./" এর অর্থ আপনি বর্তমান ডিরেক্টরিতে কোনও ফাইল চালনা করতে চান এটি উদাহরণ হিসাবে পুরো পথটি টাইপ করার শর্টকাট:

[root@server ~]#/path/to/file/file.pl

হিসাবে একই:

[root@server file]#./file.pl

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

এটির আগে " [রুট @ সার্ভার ~] # / পাথ / টু / ফাইল / ফাইল.পিএল " ফাইলটি চালিয়ে দেবে যদি আপনি ফাইলের লোকেশন থেকে "সিডি" করতে অলস হন।


-4

এটি খুব সহজ এবং এর অনেকগুলি ব্যবহার রয়েছে।

  1. যখন একই অ্যাপ্লিকেশনটির একাধিক সংস্করণ ইনস্টল করা হয়, এটি বিভিন্ন পথে পাওয়া যাবে তবে আপনার বাইনারিটির সাথে একটি নরম লিঙ্ক তৈরি করা যেতে পারে /usr/bin। উদাহরণস্বরূপ, পাইথন ২.7, পাইথন ২.6 ইনস্টল থাকলেও / usr / bin / পাইথন -> পাইথন ২.2 / usr / লোকাল / বিন / পাইথন -> পাইথন ২..6

আপনি যদি পথে থাকেন /usr/local/binএবং পাইথন চালিত করেন এটি সর্বদা পাইথন ২.7 কার্যকর করে। নির্দিষ্ট করা .বর্তমান ফোল্ডারের এক্সিকিউটেবল গ্রহণ করবে।

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