a.out
উবুন্টু টার্মিনালটি ব্যবহার করে একটি সি প্রোগ্রাম চালানোর সময় , কেন আমি সবসময় কেবল লেখার পরিবর্তে ./
আগে টাইপ করা দরকার ? এর কোন সমাধান আছে কি?a.out
a.out
a.out
উবুন্টু টার্মিনালটি ব্যবহার করে একটি সি প্রোগ্রাম চালানোর সময় , কেন আমি সবসময় কেবল লেখার পরিবর্তে ./
আগে টাইপ করা দরকার ? এর কোন সমাধান আছে কি?a.out
a.out
উত্তর:
আপনি যখন কোনও প্রোগ্রামের নাম টাইপ করেন তখন 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
"
ডিফল্টরূপে, বর্তমান ডিরেক্টরিটি পথে নেই কারণ এটি একটি সুরক্ষা ঝুঁকি হিসাবে বিবেচিত। কেন হয় দেখুন । ডিফল্ট পথে না? কেন সুপারزر উপর।
আপনার पथপথের সাথে বর্তমান ডিরেক্টরি যুক্ত করা সম্ভব, তবে লিঙ্কযুক্ত প্রশ্নে দেওয়া কারণগুলির জন্য, আমি এটি সুপারিশ করব না।
.
PATH
.
এখানে, আপনি একটি এক্সিকিউটেবল যেমন একটি পূর্ণ বা আপেক্ষিক পাথ ব্যবহার করতে পারেন /home/user/foo/a.out
বা./build/a.out
.
বিশেষ কারণ এটি "আমার বর্তমান ডিরেক্টরি" এর অর্থ এমন কোনও ডিরেক্টরি হতে পারে যা ব্যবহারকারীরা তাদের পড়ার এবং অধিকারগুলি কার্যকর করার সাথে সাথে আবিষ্কার করে। এটি একটি নির্দিষ্ট সম্পূর্ণরূপে যোগ্য পাথ যোগ করার চেয়ে সম্ভাব্য আরও বিপজ্জনক।
.
কোনও বিশেষ মর্যাদা নেই, এটি কেবল একটি পথ যা কেবল শুরু হতে পারে /
এবং ব্যাশ প্রম্পটের ./blah
সাথে cat
বা ঠিক পাশাপাশি কাজ করবে grep
।
এটার কারন খুবিই সাধারন.
ধরুন আপনার বর্তমান ডিরেক্টরিতে অ্যাপ্লিকেশন হিসাবে একই নামের একটি কমান্ড রয়েছে। তারপরে শেলের মধ্যে কমান্ডটি চালানো বিল্ট-ইন কমান্ডের পরিবর্তে আপনার অ্যাপ্লিকেশনটি শুরু করবে । এটি অন্য কোনও কিছু না হলে এটি সুরক্ষা উদ্বেগের বিষয়।
./
সামনে ব্যবহারের প্রয়োজনের দ্বারা , শেলটি জানে যে আপনি প্রদত্ত নামের সাথে অ্যাপ্লিকেশনটি চালাতে চান এবং সেই নামের কোনও বিল্ট-ইন কমান্ড নয়।
./
আপনার মধ্যে নেই এমন ফাইলগুলি কার্যকর করে $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
।
gcc
, যা স্বয়ংক্রিয়ভাবে এক্সিকিউট বিট সেট করে।
./
প্রোগ্রাম চালানোর আগে আপনাকে কেন টাইপ করতে হবে ?টার্মিনালে, যখনই আপনি কোনও অ্যাপ্লিকেশনটির নাম টাইপ করেন, আসুন আমরা বলি gedit
যে টার্মিনালটি অ্যাপ্লিকেশনগুলি (অ্যাপ্লিকেশনগুলির বাইনারি) ধারণ করে এমন কিছু (পূর্বনির্ধারিত) ডিরেক্টরিতে যাবে। এই ডিরেক্টরিগুলির নামগুলি একটি পরিবর্তনশীল বলা হয় PATH
। এক্সিকিউট করে আপনি এই ভেরিয়েবলটিতে কী দেখতে পাচ্ছেন echo $PATH
। এই ডিরেক্টরিগুলি দ্বারা বিভক্ত দেখুন :
? সেই ডিরেক্টরি যে টার্মিনাল, অনুসন্ধান যদি আপনি শুধু টাইপ যেতে হবে gedit
, nautilus
অথবা a.out
। আপনি দেখতে পাচ্ছেন, আপনার a.out
প্রোগ্রামের পথটি নেই। আপনি যখন করবেন ./a.out
, আপনি টার্মিনালটি বলছেন "বর্তমান ডিরেক্টরিটি দেখুন, এবং চালান a.out
, এবং ভিতরে যান না PATH
।
আপনি যদি ./
প্রতিবার টাইপ করতে না চান তবে আপনাকে a.out
ডিরেক্টরিটি যুক্ত করতে হবে $PATH
। নিম্নলিখিত নির্দেশাবলী, আমি যে পথে অনুমান করব a.out
হয় /path/to/programs/
, কিন্তু আপনি আপনার প্রকৃত পথে এটি পরিবর্তন করা উচিত নয়।
কেবল ফাইলের শেষে নিম্নলিখিত লাইনটি যুক্ত করুন ~/.pam_environment
:
PATH DEFAULT=${PATH}:/path/to/programs
লগ আউট এবং লগ ইন করুন You আপনি এখন কোনও ডিরেক্টরি a.out
ছাড়াই চালাতে সক্ষম হবেন ./
।
অন্যান্য ডিরেক্টরিতে যদি আপনার অন্যান্য প্রোগ্রাম থাকে তবে আপনি কেবল সেগুলি উপরের লাইনে যুক্ত করতে পারেন। যাইহোক, আমি উদাহরণ হিসাবে "মাইপ্রোগ্র্যামস" নামে একটি ডিরেক্টরি রাখার পরামর্শ দিয়েছি এবং আপনার সমস্ত প্রোগ্রাম এর অধীনে রেখেছি।
দ্রষ্টব্য:
userName
আপনার প্রকৃত উবুন্টু ব্যবহারকারীর নাম পরিবর্তন করুন ।
আপনি যদি চালাতে চান এমন অন্যান্য প্রোগ্রাম থাকে তবে কী হবে? এবং তারা সব কি বিভিন্ন ফোল্ডারে আছে? ভাল, একটি "আরও সুসংহত" সমাধান bin
হ'ল আপনার হোম ডিরেক্টরি অনুসারে একটি ফোল্ডার তৈরি করা এবং সেই ফোল্ডারের অধীনে প্রতীকী লিঙ্কগুলি (শর্টকাট) যুক্ত করা। এখানে কীভাবে:
mkdir /home/userName/bin
bin
আপনার হোম ডিরেক্টরিতে ফোল্ডারটি তৈরি করবে ।ln -s /path/to/programs/a.out /home/userName/bin
a.out
প্রোগ্রামের আওতায় একটি "প্রতীকী লিঙ্ক" (মূলত একটি শর্টকাট) তৈরি করবে bin
।লগ আউট এবং লগ ইন করুন You আপনি এখন কোনও ডিরেক্টরি a.out
ছাড়াই চালাতে সক্ষম হবেন ./
।
এখন, যখনই আপনার অন্য কোথাও অন্য প্রোগ্রাম রয়েছে, আসুন b.in
আপনার ডেস্কটপে প্রোগ্রামটি বলুন , আপনাকে যা করতে হবে তা হ'ল: ln -s /home/userName/Desktop/b.in /home/userName/bin
এবং তারপরে আপনি এটি ছাড়াও এটি চালাতে সক্ষম হবেন ./
।
দ্রষ্টব্য: @ জো এর মন্তব্যে ধন্যবাদ , আপনি যখন ব্যাকআপ করেন, প্রতীকী লিঙ্কগুলি বিশেষভাবে পরিচালনা করতে হয়। ডিফল্টরূপে,
rsync
এগুলি মোটেই প্রসেস করবেন না, সুতরাং যখন আপনি পুনরুদ্ধার করবেন তখন তারা সেখানে থাকেন না।
জর্জ তার উত্তরে যেমন উল্লেখ করেছেন, এটি আপনাকে নোট করতে সহায়তা করে যে আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিতে ( ) ডিরেক্টরি ফাইল চালাচ্ছে apwd
আমার মনে আছে আমার সিনিয়রকে এই প্রশ্নটি জিজ্ঞাসা করা অনেক আগে হয়েছিল, তিনি বলেছিলেন আমার উচিত .
আমার পথে যুক্ত করা যাতে আমি যখন a.out
এটি করি তা বর্তমান ডিরেক্টরিটিতে প্রদর্শিত হয় এবং এটি সম্পাদন করে। এই ক্ষেত্রে আমি করতে হবে না ./a.out
।
তবে ব্যক্তিগতভাবে আমি এর বিরুদ্ধে সুপারিশ করব এটি আমার কাছে কখনও ঘটেনি, তবে আপনি যদি এলিয়েন নেটওয়ার্ক ডিরেক্টরি বা অন্য কোনও কিছুতে থাকেন এবং একটি দূষিত নির্বাহযোগ্য ফাইল নামে পরিচিত ls
সেখানে উপস্থিত হন, তবে .
আপনার পথে থাকা খুব খারাপ ধারণা। আপনি এই সমস্যাটি খুব প্রায়ই চালিয়ে যাবেন না, কেবল বলছেন।
.
করতে $PATH
। খুব বিপজ্জনক ধারণা।
অন্যান্য উত্তরের পাশাপাশি, এখানে প্রয়োজনীয় অংশটি man bash
যা থেকে এটি ভালভাবে ব্যাখ্যা করা হয়েছে:
আদেশ এক্সিকিউশন কোনও কমান্ড শব্দের মধ্যে বিভক্ত হয়ে যাওয়ার পরে যদি এর ফলাফলটি একটি সাধারণ হয় কমান্ড এবং যুক্তিগুলির একটি alচ্ছিক তালিকা, নিম্নলিখিত ক্রিয়াগুলি নিয়ে যাওয়া হয়। কমান্ড নামটিতে কোনও স্ল্যাশ না থাকলে শেলটি সনাক্ত করার চেষ্টা করে এটা। যদি সেই নামে কোনও শেল ফাংশন উপস্থিত থাকে তবে সেই ফাংশনটি FUNCTIONS এ উল্লিখিত হিসাবে অনুরোধ করা হয়েছে। নাম না মিললে ক ফাংশন, শেলটি শেল বিল্টিনগুলির তালিকায় এটি অনুসন্ধান করে। যদি একটি ম্যাচ পাওয়া যায়, যে বিল্টিন আহ্বান করা হয়। নামটি শেল ফাংশন বা বিল্টিন না থাকলে এবং এতে কোনও নেই স্ল্যাশ করে, ব্যাশ ডিরেক্টরি কনসের জন্য প্যাথের প্রতিটি উপাদান অনুসন্ধান করে এই নামে একটি এক্সিকিউটেবল ফাইল টেনিং।
এ './' অর্থপূর্ণ হয় যখন আপনি এমন কোনও প্রোগ্রাম পরিচালনা করেন যা আপনার জন্য নির্দিষ্ট এবং নির্দিষ্ট, যেমন আপনার নিজস্ব own এই প্রোগ্রামটি অবশ্যই আপনার বর্তমান ডিরেক্টরিতে উপস্থিত থাকতে হবে। আপনি 'স্ট্যাথের কোথাও কোথাও রয়েছে এমন কোনও স্ট্যান্ডার্ড কমান্ড চালালে কোনও' ./ 'কোনও অর্থবোধ করে না। একটি আদেশ যা "কমান্ড-টু-রান" আপনাকে জানায় যে command PATH-তে কমান্ড-থেকে-রান রয়েছে।
$ gcc hello.c -o /path/to/someplace/hello
কিছু স্থানে এক্সিকিউটেবল উত্পাদন করে। যদি সেই অবস্থানটি আপনার পথে থাকে তবে আপনি ফাইলটি চালাতে সক্ষম হবেন। আপনি যদি এই ক্রিয়াটির জন্য একটি লেবেল তৈরি করতে চান "জিসিসি ব্যবহার করে এই উত্স কোডটি সংকলন করুন এবং আপনার পথে যে কোনও স্থানে এক্সিকিউটেবল স্থাপন করুন" আপনি এই স্ক্রিপ্টটি করতে পারেন
আমি আপনাকে "টেস্টবিন" নামক একটি নতুন ডিরেক্টরি বা সেই জাতীয় কিছু তৈরি করার পরামর্শ দিচ্ছি এবং এটি আপনার বিদ্যমান পাথ ডিরেক্টরিগুলি পরিষ্কার রাখার জন্য আপনার পথে রাখার পরামর্শ দিচ্ছি।
./
কোনও পথের জন্য অপ্রয়োজনীয় অনুসন্ধান সরিয়ে দেয়। ./
কেবলমাত্র বর্তমান ডিরেক্টরিতে অনুসন্ধান করতে বাধ্য করুন। আমরা যদি দিতে না ./
তারপর, এটা বিভিন্ন পাথ সিস্টেম মত মধ্যে নির্ধারণ অনুসন্ধান করবে /usr/bin
, /usr/sbin/
ইত্যাদি
"./" এর অর্থ আপনি বর্তমান ডিরেক্টরিতে কোনও ফাইল চালনা করতে চান এটি উদাহরণ হিসাবে পুরো পথটি টাইপ করার শর্টকাট:
[root@server ~]#/path/to/file/file.pl
হিসাবে একই:
[root@server file]#./file.pl
পূর্ববর্তী উদাহরণে আপনি ডিরেক্টরি এবং তার সুপার ডিরেক্টরিগুলির মাধ্যমে ফাইলের অবস্থানটিতে গিয়েছিলেন এবং বর্তমান ডিরেক্টরিতে ফাইলটি চালানোর জন্য "./" ব্যবহার করেছেন।
এটির আগে " [রুট @ সার্ভার ~] # / পাথ / টু / ফাইল / ফাইল.পিএল " ফাইলটি চালিয়ে দেবে যদি আপনি ফাইলের লোকেশন থেকে "সিডি" করতে অলস হন।
এটি খুব সহজ এবং এর অনেকগুলি ব্যবহার রয়েছে।
/usr/bin
। উদাহরণস্বরূপ, পাইথন ২.7, পাইথন ২.6 ইনস্টল থাকলেও / usr / bin / পাইথন -> পাইথন ২.2 / usr / লোকাল / বিন / পাইথন -> পাইথন ২..6আপনি যদি পথে থাকেন /usr/local/bin
এবং পাইথন চালিত করেন এটি সর্বদা পাইথন ২.7 কার্যকর করে। নির্দিষ্ট করা .
বর্তমান ফোল্ডারের এক্সিকিউটেবল গ্রহণ করবে।
.
- সর্বদা বর্তমান ডিরেক্টরি থেকে সম্পাদন প্রতিনিধিত্ব করে। এবং ..
সর্বদা মানে পূর্ববর্তী ডিরেক্টরি থেকে কার্যকর করা।