./ বনাম। টার্মিনাল অধীনে প্রোগ্রাম চলমান জন্য


13

টার্মিনালের অধীনে আমরা এক্সিকিউটেবলকে কীভাবে চালাচ্ছি সে সম্পর্কে আমার কিছু ব্যাখ্যা দরকার need এটি একটি লম্পট প্রশ্ন হতে পারে তবে একটি এক্সিকিউটিভ চালানো ./an_executableএবং এর সাথে পার্থক্য কী . an_executable(ধরে নেওয়া যাক যে আমরা যে ডাইরে রয়েছি যেখানে an_executable রয়েছে)

আমি ইতিমধ্যে জানি যে প্রাক্তনটি শেলটিকে বর্তমান ডিরেক্টরিতে ( .) এর an_executable সন্ধান করে , তবে পরবর্তী সংস্করণটি ব্যবহার করার /পরে কেন প্রয়োজন হয় না .?

আগাম ধন্যবাদ.


আরও দেখুন askubuntu.com/q/182012/26972
ysap

উত্তর:


22

. executableসিনট্যাক্স কোন এক্সিকিউটেবল সাথে কাজ করে না (অথবা এটা আছে?)। পরিবর্তে, এটি sourceঅন্তর্নির্মিত ব্যাশের জন্য একটি উপনাম । সুতরাং পার্থক্যটি বেশিরভাগ ক্ষেত্রে বাশ স্ক্রিপ্টগুলির সাথে প্রাসঙ্গিক এবং সত্যটি হ'ল তারা সম্পূর্ণ আলাদা জিনিস :)

./executableএক্সিকিউটেবলকে "সাধারণভাবে" চালাতে বলে। ./বর্তমানের পথে একটি আপেক্ষিক রেফারেন্স। এটি শেল (বাশ) থাকাটিকে এড়ানোর ফলে কোনও ডিরেক্টরিতে এক্সিকিউটেবলকে সনাক্ত করার চেষ্টা করা হয় $PATH(এটি যদি আপনি কমান্ডের সাথে কোনও পথ নির্দিষ্ট না করে থাকেন)। আপনি কেবল না পারার কারণটি executableহ'ল সুরক্ষার একটি; মনে করুন আপনার একটি সংরক্ষণাগার আপনি ডাউনলোড কমপ্রেস এবং এটি একটি দূষিত সংস্করণ রয়েছে ls। এটি যদি আপনার বর্তমান ডিরেক্টরি থেকে সরাসরি চলে যায় তবে আপনি উপলব্ধি না করেই সংস্করণটি চালাবেন।

অন্যদিকে, . executableবলছে "উত্স একটি নাম ফাইল executable"। যেহেতু আপনি সরাসরি ফাইলটির নামকরণ করছেন এবং এটি সত্যিই কার্যকর করার দরকার নেই, তাই AT প্যাথের জন্য সুরক্ষা নিষেধাজ্ঞা প্রযোজ্য নয়। সোর্সিং শেল স্ক্রিপ্টগুলি কেবল "চালিত" হবে (বা মনে হয়)। এটি যা করে তা হ'ল:

   source filename [arguments]
          Read and execute commands from filename  in  the  current  shell
          environment  and return the exit status of the last command exe‐
          cuted from filename.

সুতরাং ... মৃত্যুদন্ড কার্যকর করা এবং উত্সর্গকরণের মধ্যে আসলে কী পার্থক্য? একই শেল স্ক্রিপ্টটি ধরে ./scriptনিলে, এটি কার্যকর করা ( ) কার্যকর করা একটি নতুন শেল তৈরি করবে, সেই শেলের ভিতরে স্ক্রিপ্টটি চালাবে এবং যখন স্ক্রিপ্টটি প্রস্থান করবে তখন সেই শেলটি বন্ধ করে প্যারেন্ট শেলটিতে ফিরে আসবে। বাস্তবে, এটি bashস্ক্রিপ্টটি কার্যকর করতে একটি নতুন প্রক্রিয়া শুরু করবে )।

( . script) বর্তমান শেলটি ফাইল থেকে কমান্ডগুলি পড়ার জন্য যেমন সেগুলি কমান্ড লাইনে টাইপ করা হচ্ছে will এখানে কোনও নতুন শেল বিস্তৃত হয়নি।

এটি কীভাবে আচরণ করে তা দেখার একটি খুব সহজ উপায় হ'ল কেবল একটি স্ক্রিপ্ট লিখতে exit। যদি আপনি ./scriptএটি করেন তবে কিছুই ঘটবে না বলে মনে হচ্ছে, এটি একটি নতুন শেল প্রক্রিয়া শুরু হওয়ার কারণে, exitকমান্ডটি নতুন শেলটি থেকে বেরিয়ে আসে এবং আপনার বর্তমান শেলটি ক্ষতিগ্রস্থ হয়নি।

আপনি যদি . script, আপনার বর্তমান টার্মিনালটি বন্ধ হবে, কারণ exitবর্তমান শেলটিতে কমান্ডটি চলমান। সুতরাং এটি exitকমান্ড প্রম্পটে টাইপ করার সমতুল্য ।


আসলে আমি শেল স্ক্রিপ্ট নিয়ে কাজ করছি যখন আমি এই আচরণটি লক্ষ্য করেছি। আপনাকে অনেক ধন্যবাদ, আমার যে উত্তরটির প্রয়োজন ছিল তা ধন্যবাদ। :)
জিপজ্যাপ

আরেকটি প্রশ্ন উত্থাপিত (যদি আপনি কিছু মনে করেন না): আমার স্ক্রিপ্টে যদি প্রতিধ্বনি সহ কিছু সাধারণ বার্তা থাকে এবং আমি এটি / / স্ক্রিপ্ট দিয়ে চালাচ্ছি, তবে কেন সাব-শেল বন্ধ হয়ে যায় যদি আমি প্যারেন্ট শেলটিতে বার্তাগুলি দেখতে পারি? ফাঁসি কার্যকর হওয়ার সাথে সাথে?
জিপজ্যাপ

2
কারণ সাবশেলটি একটি পৃথক প্রক্রিয়া হওয়ার সময় , এটি আমন্ত্রণকারী শেলের মতো একই টার্মিনালটি ব্যবহার করে । এটি কীভাবে আপনি এখনও lsআউটপুট দেখতে সক্ষম তা সমান : আপনি কমান্ডটি টাইপ করেন, এটি চালায়, আউটপুট দেখায় এবং তারপরে এটি শেষ হয় তবে আউটপুট টার্মিনালে থেকে যায় in
রোডম্রি

2
টার্মিনাল দিয়ে শেল বিভ্রান্ত করবেন না; তারা বিভিন্ন জিনিস। একটি টার্মিনাল খুলুন, এবং কমান্ড প্রম্পট bashএটির ভিতরে চলমান শেল দ্বারা দেওয়া হবে। আপনি টাইপ তাহলে bash, আপনি চলমান করা হবে আরেকটি শেল; প্রথম শেল থেকে, এটি চালানো মাত্র একটি প্রোগ্রাম। আপনি যদি টাইপ করেন তবে আপনি শুরু করা শেষ শেলটি exitবন্ধ করে দেবেন তবে এখনও প্রথম শেলটিতে থাকবেন (আপনি যখন টার্মিনাল শুরু করেছিলেন তখন থেকে একটি)। আবার, এটি একই টার্মিনালের মধ্যে ঘটে।
রোডম্রি

1
@ ডেভিডজেড আমি এটি উল্লেখ করেছি :) :) "সোর্সিং শেল স্ক্রিপ্টগুলি কেবল" চালানো "(বা মনে হয় চালানো হবে)" "
রোডম্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.