শুধু নাম দিয়ে এক্সিকিউটেবল চালানো এবং এর আগে কোনও ডট / স্ল্যাশ যুক্ত করার মধ্যে পার্থক্য কী?


13

এটি ls -allকমান্ড থেকে আউটপুট :

-rwxr----- 1 subhrcho dba  3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba  1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba   347 Mar  6  2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba   821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba   584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba  4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba  5047 Dec  6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe

এখন আমি যখন jdevএটি চালিয়েছি তখন ওড়াকল জেডব্লপারের যখন এটি চালিত হয় তার চেয়ে আলাদা সংস্করণটি চালিত হয় ./jdev.. এটি কেন এমন?

উত্তর:


20

আপনি যখন এক্সিকিউটেবল ফাইল (বা বরং ইউনিক্স / লিনাক্স ওয়ার্ল্ডে - এক্সিকিউটেবল রাইটস / ফ্ল্যাগ অন ফাইল) চালিয়ে যান তখন:

$ ./jdev

তারপরে চিহ্নিত করুন .যে আপনি নিজের ওয়ার্কিং ডিরেক্টরি (যে ডিরেক্টরিতে বর্তমানে আপনি রয়েছেন) এর মধ্যে এমন একটি ফাইল চালাতে চান যা নাম প্রকাশ jdevকরেছে এবং ব্যবহারকারীর জন্য এটি কার্যকর করার অধিকার রয়েছে যা এটি চালু করছে (আপনাকে লক্ষ্য রাখতে হবে যে এটি এখনও একটি লিঙ্ক হতে পারে অন্য ফাইল, আপনি ls -l jdevটার্মিনাল টাইপ করে এটি পরীক্ষা করতে পারেন )

( লিনাক্স / ইউনিক্সে ফাইল অনুমতি দেখুন )

যখন আপনি এটি চালানো

$ jdev

তারপরে সম্ভবত jdevসিস্টেমে কোথাও ইনস্টল করা আছে এবং এটি আপনার $PATH(যেমন /usr/bin/বা /bin/বা /usr/local/bin/) এ রয়েছে

পিটারফ যেমন বলেছে: আপনি whichনির্দিষ্ট আদেশের সাহায্যে চালু করা এক্সিকিউটেবলকে নির্দেশ করতে ব্যবহার করতে পারেন , যেমন:

$ which find
/usr/bin/find

1
এছাড়াও যে whichইউটিলিটি আপনাকে কোনও রাস্তা না দিলে এক্সিকিউটেবল কী ব্যবহার করা হবে তা বলতে পারে can
পিটার্ফ

@ পেটার্ফ আমার উত্তর সম্পাদনা করেছেন
প্যাট্রিক

7
typeনির্দিষ্ট কমান্ড দ্বারা কি চালু হয়েছে তা যাচাই করার জন্য এটি ব্যবহার করা আরও ভাল । কারণ whichআপনাকে somewhere PATH- এ কোথাও কেবল একটি বাইনারি দেখাবে, তবে এটি একেবারে অন্য বাইনারি হিসাবে যুক্ত হতে পারে।
রাশ

@rush আমি শুধু যে চেষ্টা করেছে এবং এটি হিসাবে আপনি বলতে কাজ করবে না: [~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim। যখনzsoelim -> soelim
প্যাট্রিক

2
@ প্যাট্রিক আমি মনে করি রাশ মানে শেল অ্যালিয়াস / ফাংশন, যার whichসন্ধানের কোনও সম্ভাবনা নেই, যেহেতু এটি স্ট্যান্ডলোন বাইনারি যা চলমান শেল পরিবেশে অ্যাক্সেস পায় না (যার দ্বারা আমি কেবলমাত্র পরিবেশের ভেরিয়েবলগুলিই নয়, এলিয়াস এবং ফাংশন বলতে চাইছি) , যার মধ্যে কিছু উত্তরাধিকার সূত্রে প্রাপ্ত)।
পিটার্ফ

8

আপনি যদি শেলটিতে নাম না দিয়ে কোনও কমান্ড কল করেন তবে এটি শেল এলিয়াস, ফাংশন এবং $PATHপরিবেশ পরিবর্তনশীল প্রদত্ত পাথের তালিকায় সন্ধান করা হবে । (নোট করুন যে আপনার বর্তমান চলমান ডিরেক্টরি (যেমন .খালি স্ট্রিং হিসাবে নির্দিষ্ট ) বা কোনও আপেক্ষিক ডিরেক্টরি থাকতে পারে $PATHতবে এটি সুরক্ষার কারণে প্রস্তাবিত নয়)।

যদি নামে কোনও স্ল্যাশ থাকে, তবে তা ঘটে না, নামটি আদেশটি কার্যকর করার পথ হিসাবে নেওয়া হয়েছে (যদিও কিছু শেল যেমন zshএলিয়াস বা ফাংশনগুলিকে তাদের নামে স্ল্যাশ দেয় যা তারপরে প্রাধান্য পাবে)।

সুতরাং, আপনি যদি fooএখনকার কার্যনির্বাহী ডিরেক্টরিতে অবস্থিত একটি কমান্ড চালাতে চান , আপনাকে স্ল্যাশযুক্ত একটি নাম নিয়ে আসতে হবে contains ./fooসবচেয়ে সুস্পষ্ট। আপনি পুরো পথটিও ব্যবহার করতে পারেন, বা ../dir/foo...

শেলটি কী চলবে তা জানতে, typeকমান্ডটি ব্যবহার করুন । কমান্ডটি ব্যবহার করবেন নাwhich যা সাধারণভাবে আপনি যা ভাবেন তা করে না এবং এটি এমন একটি heritageতিহ্য cshযা থেকে আরও ভালভাবেই ছেড়ে দেওয়া হয়।


কেন "কোন" কিন্তু "টাইপ" না?
গীক

@ গীক, এটি এখানে প্রায়শই জিজ্ঞাসিত প্রশ্নাবলীর তালিকা দেখুন, ইউনিক্স.স্ট্যাকেক্সেঞ্জাওন.কম
স্টাফেন

আপনি কি সঠিক লিঙ্কটি সরবরাহ করেছেন?
গীক

এটি প্রায়শই জিজ্ঞাসিত প্রশ্ন প্রমাণ করার জন্য এটি এই সাইটে অনুসন্ধানের ফলাফল। এই প্রশ্নগুলির অনেক উত্তর আপনাকে বলবে কেন ব্যবহার করবেন না which। উদাহরণস্বরূপ দেখুন unix.stackexchange.com/questions/16693/…
স্টাফেন চেজেলাস

2

আমি Zsh এর অন্তর্নির্মিত 'যেখানে' ('এর চেয়ে' ভাল) কীভাবে এবং কীভাবে অ্যালিয়াস, শেল বিল্ট-ইনগুলি বা অন্য যে কোনও কিছু পাওয়া যাবে $ PATH ;-)

জিনিসগুলি আরও ভালভাবে বোঝার জন্য এখানে উদাহরণ দেওয়া আছে, কীভাবে এটি চয়ন করা হয়:

[ 0:04:08 ] afsin@s15426859:~ % pwd
/home/afsin
[ 0:04:30 ] afsin@s15426859:~ % which who
/usr/bin/who
[ 0:04:47 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:27 ] afsin@s15426859:~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/afsin/bin
[ 0:05:31 ] afsin@s15426859:~ % touch who
[ 0:05:40 ] afsin@s15426859:~ % chmod +x who
[ 0:05:47 ] afsin@s15426859:~ % ls -al who
-rwxr-xr-x 1 afsin afsin 0 23. Jan 00:05 who
[ 0:05:50 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:55 ] afsin@s15426859:~ % export PATH=$PATH:.
[ 0:06:09 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:14 ] afsin@s15426859:~ % alias who=who
[ 0:06:19 ] afsin@s15426859:~ % where who
who: aliased to who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:22 ] afsin@s15426859:~ % which who
who: aliased to who
[ 0:06:27 ] afsin@s15426859:~ %

1

যদিও এটি সম্ভবত আপনার শেলের উপর নির্ভর করে, নিয়মটি সাধারণত:

  • যদি আপনি কোনও পথ সরবরাহ করেন তবে হয় আপেক্ষিক বা পরম, সেই পথটি ব্যবহৃত হয়। ./jdevএকটি আপেক্ষিক পাথ, কারণ .বর্তমান ডিরেক্টরি বোঝায় (আসলে, ls -all .আপনাকে যেমন দেবে ls -all)। যদি আপনি তা করেন তবে আপনি /usr/bin/tool/একটি পরম পথ ব্যবহার করছেন। এই ক্ষেত্রে, নির্দেশিত ফাইলটি কার্যকর করা হয়।

  • আপনি যদি কোনও পথ সরবরাহ না করেন তবে কেবল একটি নাম রাখেন তবে এর মধ্যে ডিরেক্টরিগুলি $PATHআপনি চালনার চেষ্টা করছেন সেই সরঞ্জামটির জন্য অনুসন্ধান করা হবে।

আপনার যদি বর্তমান ডিরেক্টরিতে কোনও ডিরেক্টরিতে কিছু ডিরেক্টরিতে একই নামের ফাইল থাকে $PATHএবং আপনি ./এটির নামের প্রিপেন্ডিং দিয়ে চালনা করেন, আপনি কার্যকরভাবে একটি আলাদা ফাইল চালাবেন।

সম্ভবত আর একটি সমস্যা হ'ল আপনি সম্ভবত jdevবর্তমান ডিরেক্টরিতে এক্সিকিউটেবল চালানোর আশা করেছিলেন। $PATHআপনি অন্তর্ভুক্ত পরিবর্তন .না করে, এটি এমন কিছু নয় যা আপনার মোটেই আশা করা উচিত ...

... এবং এটি অন্তর্ভুক্ত করা এখনও খুব ভাল ধারণা নয় ., আপনি যদি এটি করেন তবে দয়া করে কমপক্ষে এটি শেষে রেখে দিন, যাতে বাকী অংশটি $PATHসর্বদা প্রথম অনুসন্ধান করা হয় - কেবল কল্পনা করুন যে আপনি একটি ভাগ করা নেটওয়ার্ক ডিরেক্টরিতে আছেন এবং কেউ সেখানে দুষ্টু বাইনারি রাখার সিদ্ধান্ত নিয়েছে ls, যদি এটি $PATHশুরু হয় ., ls -lahআপনার সিস্টেমে আক্রমণ করার জন্য একটি সহজ সরল যথেষ্ট।


আপনার পরিভাষা বিভ্রান্তিকর। jdevএকা এছাড়াও একটি আপেক্ষিক পথ। বিধিটি হ'ল: যদি এতে কোনও স্ল্যাশ না থাকে, তবে এটির নাম, ফাংশন এবং $PATHঅন্যথায়, এটি সরাসরি ফাইল সিস্টেমে দেখানো হয় (যদিও কিছু শেলগুলি তাদের নামের সাথে / সাথে এলিয়াস বা ফাংশন দেয় যা পরে গ্রহণ করবে একটি precendence)।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.