B _` কখন বাশ শেলের পরিবেশ পরিবর্তনশীল হয়?


10

বাশ ম্যানুয়াল বলেছেন (ম্যানপেজ, আমার জোর):

বাশ যখন বাহ্যিক কমান্ডটি আহ্বান করে, তখন ভেরিয়েবলটি কমান্ডের $_পুরো পথের সাথে সেট করা হয় এবং তার পরিবেশে সেই কমান্ডে প্রেরণ করা হয়।

এবং ( বিশেষ পরামিতি ):

_

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

  1. ব্যাশ শেল এ, আমি চালাচ্ছি:

    $ bash
    $ export | grep '_=' 
    

    ম্যানুয়াল অনুসারে, _নতুন ব্যাশ শেলের পরিবেশ পরিবর্তনশীল হওয়া উচিত। exportনতুন ব্যাশ শেলের সমস্ত পরিবেশের ভেরিয়েবল আউটপুট দেওয়ার কথা রয়েছে, তবে এটি আউটপুট দেয় না _। সুতরাং আমি ভাবছি _নতুন বাশ শেলের পরিবেশ পরিবর্তনশীল কিনা ?

  2. আসলে যে কোনও বাশ শেলের ক্ষেত্রে একই জিনিস ঘটে

    $ export | grep '_='

    কিছুই আউটপুট দেয় না। সুতরাং আমি ভাবছি যদি _কখনও বাশ শেলের পরিবেশ পরিবর্তনশীল হয়?

  3. তুলনার জন্য:

    $ dash
    $ export  | grep '_='        
    export _='/bin/dash'
    

আমার পোস্ট মাইকের মন্তব্য এবং স্টিফেনের জবাব দ্বারা অনুপ্রাণিত ।


1
এটি একটি শেল পরিবর্তনশীল, এবং এটি কমান্ডের পরিবেশে পৌঁছেছে; এটি শেলের পরিবেশে অগত্যা রফতানি হয় নাexportএকটি অন্তর্নির্মিত, তবে আপনি যদি printenv _এটি ব্যবহার করেন তবে এটি আপনাকে দেখাবে যে এটি কীভাবে ডাকা হয়েছিল: /usr/bin/printenvএই সিস্টেমে।
টবির গতি

মনে রাখবেন যে bash -c export | grep _=(বাশ থেকে), প্যারেন্টে আনসেট থাকা সত্ত্বেও প্যারেন্ট শেল কীভাবে কমান্ডটি চাওয়া হবে show bash$_
টবি স্পিড

উত্তর:


13

হ্যাঁ, _নতুন বাশের শেলের পরিবেশগত পরিবর্তনশীল; আপনি দৌড় দিয়ে এটি দেখতে পারেন

tr '\0' '\n' < /proc/$$/environ | grep _=

শেলের ভিতরে: এটি শেলের প্রাথমিক পরিবেশের বিষয়বস্তু প্রদর্শন করে। আপনি এটি প্রথম শেলটিতে দেখতে পাবেন না কারণ এটি শুরুর আগে সেট করার জন্য আগের শেল ছিল না।

সম্প্রসারিত $_ব্যাশ ভিতরে বোঝায় _বিশেষ প্যারামিটার, যা পূর্ববর্তী কমান্ডের গত যুক্তি বিস্তৃতি ঘটে। (অভ্যন্তরীণভাবে ব্যাশ একটি ব্যবহার করে এই পরিচালনা _শেল পরিবর্তনশীল, যা প্রত্যেক সময় কমান্ড পার্স করা হয় আপডেট করা হয়, কিন্তু যে সত্যিই একটি বাস্তবায়ন বিস্তারিত আছে। এটি হবে "unexported" প্রত্যেক সময় কমান্ড পার্স করা হয়। ) exportপ্রদর্শন করা হয় না _, কারণ এটা নয় একটি পরিবর্তনশীল যা রফতানি হিসাবে চিহ্নিত করা হয়; আপনি তবে এর আউটপুট এ দেখতে পারেন set

প্রথম উদাহরণে, নতুন ব্যাশ শেল পার্স এবং তার সূচনার ফাইলের মধ্যে কমান্ড executes, তাই যখন চলমান explore | grep '-=', _ইতিমধ্যে ওভাররাইট হয়েছে এবং হিসাবে চিহ্নিত রপ্তানি করেননি।

ইন dashউদাহরণস্বরূপ, এটি কোনো স্টার্ট আপ ফাইল চালানো, যাতে আপনি একটি পরিবেশ পরিবর্তনশীল যে চালানোর আগে ব্যাশ দ্বারা সেট করা হয়েছে পরিবর্তনশীল দেখছি বলে মনে হচ্ছে না dash


ধন্যবাদ। নতুন ব্যাশ শেলের মধ্যে কেন export | grep '_='কিছু আউটপুট হয় না ? মূল বাশ শেলের মধ্যে কেন tr '\0' '\n' < /proc/$$/environ | grep _=কিছুই আউটপুট হয় না ?
টিম


9

exportযুক্তি ছাড়াই সমস্ত রফতানি চলক তালিকা করে_পরিবর্তনশীল নয়, তবে এটি একটি বিশেষ পরামিতি হিসাবে তালিকাভুক্ত ।

কিছুটা confusingly, _এছাড়াও হবে একটি পরিবর্তনশীল বৈধ নাম , অন্যান্য বিশেষ পরামিতি নাম অসদৃশ। কমপক্ষে 4.4 বাশ কোনও অভিযোগ ছাড়াই এটিতে অ্যাসাইনমেন্টের অনুমতি দেয়। এটি কেবল কার্যকর নয় কারণ বিশেষ প্রভাবটি অবিলম্বে মানটিকে ওভাররাইড করে।


2
_;-) যদিও চলক হিসাবে ব্যবহার করার চেষ্টা করতে মজা করুন । এটি কার্যকরভাবে কেবল লেখার জন্য এবং মান অবিলম্বে হারাতে হবে।
স্টিফেন কিট

1
এছাড়াও, অভ্যন্তরীণভাবে বাশ _একটি পরিবর্তনশীল হিসাবে বিবেচনা করে , যার কারণে এটি এর আউটপুটে প্রদর্শিত হয় set। তবে যতদূর আমি নির্ধারণ করতে পারি এটি রফতানি হিসাবে চিহ্নিত করা যায় না।
স্টিফেন কিট

2
@ স্টেফেনকিট, তবে বাশ ৪.৪ এটিকে কেবল পঠনযোগ্য হিসাবে চিহ্নিত করতে দেয়। বা একটি পূর্ণসংখ্যা কিছুটা হাস্যকর ফলাফল সহ With
ilkkachu

1
হা, সুন্দর সন্ধান, এটি বরং মজাদার!
স্টিফেন কিট

5

প্রতিটি শেল ভেরিয়েবল এস এর রফতানি হিসাবে চিহ্নিত হিসাবে আপনি এর আউটপুটে দেখতে পাবেন না declare -p

এটি রফতানি হিসাবে bashচিহ্নিত করার কোনও মানে হয় না $_কারণ এটি স্বয়ংক্রিয়ভাবে শিশু প্রসেসের পরিবেশে এই পরিবর্তনশীলটি যুক্ত করে তবে শেলের মধ্যে রয়েছে তার চেয়ে আলাদা মান সহ (এই মুহুর্তে)।

এটিকে রফতানি হিসাবে দেখানো বাহ্যিক কমান্ডের পরিবেশের সাথে কী ঘটবে তা সম্পর্কে বিভ্রান্ত হবে।

সমস্ত "রানটাইম ভেরিয়েবল" BASH*রফতানি হয় না।

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