এই সফটলিঙ্কটি প্রত্যাশার মতো কাজ করে না কেন?


11
bash4.3 # pwd
/bin
bash4.3 # ll sh
lrwxrwxrwx. 1   root    root    4   May 17 22:22 sh -> bash
bash4.3 # ll bash
-rwxr-xr-x. 1   root    root    1072056 May 17 22:22 bash
bash4.3 # bash
bash4.3 # sh
sh-4.3#

আমার ওএস ফেডোরা 24 (ডিফল্ট জিনোম সংস্করণ)।

উদাহরণ থেকে আমরা জানতে পারি: আন্ডার /bin, bashবাইনারি এক্সিকিউটেবল; shএকটি নরম লিঙ্ক bash

সুতরাং, আমার জ্ঞান অনুযায়ী, type bash and press enterএকই ফলাফল একইভাবে প্রভাবিত করা উচিত type sh and press enter

আমি যখন type bash and press enter, আমি [root@localhost bin]#প্রত্যাশিত হিসাবে পেতে ।

যাইহোক, আমি type sh and press enter, আমি আশ্চর্যজনকভাবে পেতে sh-4.3#

কারণ কি?


একটি চিত্র হিসাবে খুব সহজেই কোনও এসই সম্পাদকের কাছে অনুলিপি করা যায় এমন পাঠ্যটি বেশ বিরক্তিকর, সুতরাং দয়া করে এটি করবেন না। পরিবর্তে, আপনার টার্মিনালে পাঠ্যটি নির্বাচন করুন এবং CTRL-SHIFT-C টিপুন।
বিড়াল

উত্তর:


25

এটি একটি নথিযুক্ত বৈশিষ্ট্য।

আপনি যদি নামের একটি সিমিলিংকের মাধ্যমে বাশ চালান sh, তবে ব্যাশ shসামঞ্জস্যতা মোডে শুরু হবে ।

থেকে man bash:

যদি শ নামের সাথে বাশটি প্রেরণ করা হয় তবে এটি পসিক্স স্ট্যান্ডার্ডের সাথে সামঞ্জস্য রেখে যতটা সম্ভব নিবিড়ভাবে ofতিহাসিক সংস্করণের শুরুর আচরণটি নকল করার চেষ্টা করে। ইন্টারেক্টিভ লগইন শেল, বা - লগিন বিকল্পের সাথে একটি অ-ইন্টারেক্টিভ শেল হিসাবে আহ্বান করা হলে, প্রথমে সেই আদেশটি / etc / প্রোফাইল এবং ~ /। প্রোফাইল থেকে আদেশগুলি পড়ার এবং সম্পাদন করার চেষ্টা করে। --Noprofile বিকল্পটি এই আচরণটি বাধা দিতে ব্যবহৃত হতে পারে। Sh নামের সাথে একটি ইন্টারেক্টিভ শেল হিসাবে আহ্বান করা হলে, ব্যাশ ভেরিয়েবল ENV সন্ধান করে, সংজ্ঞায়িত হলে এর মান প্রসারিত করে এবং পড়তে এবং সম্পাদন করতে ফাইলের নাম হিসাবে প্রসারিত মানটি ব্যবহার করে। যেহেতু sh হিসাবে আহ্বান করা একটি শেল অন্য কোনও স্টার্টআপ ফাইল থেকে কমান্ডগুলি পড়তে এবং চালিত করার চেষ্টা করে না, --rcfile বিকল্পের কোনও প্রভাব নেই। Sh নামের সাথে যুক্ত একটি অ-ইন্টারেক্টিভ শেল অন্য কোনও স্টার্টআপ ফাইল পড়ার চেষ্টা করে না। Sh হিসাবে আহ্বান করা হলে, ব্যাশ স্টার্টআপ ফাইলগুলি পড়ার পরে পক্সিক্স মোডে প্রবেশ করে।

কোনও প্রোগ্রাম কীভাবে জানতে পারে যে নামটি শুরু করার জন্য ব্যবহৃত হয়েছিল?

এটি যদি এসি প্রোগ্রাম হয় তবে এটি পরিদর্শন করতে পারে argv[0]। এটি শেল বা পার্ল স্ক্রিপ্ট হলে এটি পরিদর্শন করতে পারে $0

উদাহরণ হিসাবে, আসুন এই সহজ শেল স্ক্রিপ্টটি বিবেচনা করুন:

$ cat utc
#!/bin/sh
case "${0##*/}" in
        utc) date -u ;;
        et) TZ=US/Eastern date ;;
esac

$0স্ক্রিপ্ট দ্বারা ডেকে আনা সেই নামটি। ${0##*/}যে নামটি স্ক্রিপ্টটিকে ডেকে আনা হয়েছে এমন কোনও ডিরেক্টরি নামের সাথে ডাকা হয়েছিল।

আসুন এই সিমিলিংক তৈরি করুন:

ln -s utc et

সুতরাং, utcএবং etউভয়ই একই নির্বাহযোগ্য চালায় তবে তারা বিভিন্ন ফলাফল সরবরাহ করে। যখন চালানো হয় utc, এটি সর্বজনীন সময়কে আউটপুট করে। যখন চালানো হয় et, মার্কিন পূর্ব সময়কে আউটপুট দেয়। উদাহরণ স্বরূপ:

$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016

4
এটি কীভাবে সম্ভব তা যুক্ত করতে পারে, কারণ ওপি কলগুলি অভিন্ন হওয়ার প্রত্যাশা করে। ( argv[0], obvs)
অরবিট

নিবন্ধন করুন আমি একটি উদাহরণ যুক্ত করেছি।
1024

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