বাশ ম্যানুয়াল অনুসারে , পরিবেশের পরিবর্তনশীল BASH_COMMAND
রয়েছে
কমান্ডটি বর্তমানে কার্যকর করা হচ্ছে বা কার্যকর হতে চলেছে, যদি না শেল ফাঁসের ফলে কোনও কমান্ড কার্যকর না করে, তবে সেই ক্ষেত্রে এটি ফাঁসের সময় সঞ্চালিত কমান্ড হয়।
এই ট্র্যাপ কর্নার কেসটিকে একপাশে রেখে, যদি আমি সঠিকভাবে বুঝতে পারি তবে এর অর্থ হ'ল আমি যখন কোনও কমান্ড কার্যকর করি তখন ভেরিয়েবলটিতে BASH_COMMAND
সেই কমান্ড থাকে। এটা একেবারে পরিষ্কার না কিনা পরিবর্তনশীল কমান্ড সঞ্চালনের পর সেট করা থাকে না (অর্থাত, শুধুমাত্র avaialble হয় যখন , কমান্ড চলছে, কিন্তু পরে না) যদিও এক তর্ক হতে পারে যে যেহেতু এটা "কমান্ড বর্তমানে মৃত্যুদন্ড কার্যকর বা হচ্ছে সম্পর্কে করা মৃত্যুদন্ড কার্যকর" এটি সুনির্দিষ্টভাবে কার্যকর করা আদেশ নয় ।
তবে চেক করা যাক:
$ set | grep BASH_COMMAND=
$
খালি। আমি দেখতে BASH_COMMAND='set | grep BASH_COMMAND='
বা সম্ভবত ন্যায়বিচারের আশা করতাম BASH_COMMAND='set'
, তবে খালি আমাকে অবাক করে দেয়।
আসুন অন্য কিছু চেষ্টা করুন:
$ echo $BASH_COMMAND
echo $BASH_COMMAND
$
ঠিক আছে যে বোধগম্য। আমি কমান্ডটি কার্যকর করি echo $BASH_COMMAND
এবং ভেরিয়েবলের BASH_COMMAND
স্ট্রিং থাকে echo $BASH_COMMAND
। এবার কেন কাজ করলেন, তবে আগে হয়নি?
set
আবার জিনিসটি করা যাক :
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
তাই অপেক্ষা করুন। এটা তোলে ছিল যখন আমি যে মৃত্যুদন্ড কার্যকর সেট echo
কমান্ড, এবং এটি ছিল না পরে সেট না। কিন্তু যখন আমি set
আবার মৃত্যুদন্ড কার্যকর করি , কমান্ডে সেট BASH_COMMAND
করা হয়নিset
। আমি set
কমান্ডটি প্রায়শই প্রায়শই প্রয়োগ করি না কেন , ফলাফল একই থাকে। সুতরাং, কার্যকর করার সময় ভেরিয়েবল সেট হয় echo
, কিন্তু কার্যকর করার সময় নয় set
? দেখা যাক.
$ echo Hello AskUbuntu
Hello AskUbuntu
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
কি? পরিবর্তনশীল সুতরাং যখন আমি মৃত্যুদন্ড কার্যকর হয় echo $BASH_COMMAND
, কিন্তু না আমি যখন মৃত্যুদন্ড কার্যকর echo Hello AskUbuntu
? পার্থক্য এখন কোথায়? চলকটি কেবল তখনই সেট করা থাকে যখন বর্তমান কমান্ড নিজেই শেলটিকে ভেরিয়েবলটি মূল্যায়ন করতে বাধ্য করে? আসুন কিছু অন্য চেষ্টা করুন। পরিবর্তনের জন্য সম্ভবত এই মুহূর্তে কিছু বাহ্যিক কমান্ড, ব্যাশ বিল্টিন নয়।
$ /bin/echo $BASH_COMMAND
/bin/echo $BASH_COMMAND
$ set | grep BASH_COMMAND=
BASH_COMMAND='/bin/echo $BASH_COMMAND'
$
হুম, ঠিক আছে ... আবার, পরিবর্তনশীল সেট করা হয়েছিল। তাহলে আমার বর্তমান অনুমান সঠিক? ভেরিয়েবলটি কেবল তখনই সেট করা থাকে যখন এটি মূল্যায়ন করতে হয়? কেন? কেন? পারফরম্যান্সের কারণে? আরও একবার চেষ্টা করা যাক। আমরা $BASH_COMMAND
কোনও ফাইলের জন্য গ্রেপ করার চেষ্টা করব এবং যেহেতু $BASH_COMMAND
তখন একটি grep
কমান্ড থাকা উচিত , grep
সেই grep
কমান্ডের (যেমন, নিজের জন্য) গ্রেপ করা উচিত । সুতরাং একটি উপযুক্ত ফাইল করা যাক:
$ echo -e "1 foo\n2 grep\n3 bar\n4 grep \$BASH_COMMAND tmp" > tmp
$ grep $BASH_COMMAND tmp
grep: $BASH_COMMAND: No such file or directory
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
$ set | grep BASH_COMMAND=
BASH_COMMAND='grep --color=auto $BASH_COMMAND tmp'
$
ঠিক আছে, আকর্ষণীয়। কমান্ডটি grep $BASH_COMMAND tmp
প্রসারিত হয়েছে grep grep $BASH_COMMAND tmp tmp
(ভেরিয়েবলটি অবশ্যই একবারে প্রসারিত হয়ে যায়), এবং তাই আমি গ্রেপ্তার হয়েছি grep
, এমন একটি ফাইল $BASH_COMMAND
যা একবার অস্তিত্বহীন নয় এবং দুটিবার ফাইলটিতে tmp
।
প্র 1: আমার বর্তমান অনুমানটি কি সঠিক:
BASH_COMMAND
কেবল তখনই সেট করা হয় যখন কোনও কমান্ড এটির মূল্যায়নের চেষ্টা করে; এবং- কমান্ড কার্যকর করার পরে এটি আনসেট হয় না , যদিও বিবরণটি আমাদের বিশ্বাস করতে পারে?
প্রশ্ন 2: হ্যাঁ, কেন? কর্মক্ষমতা? যদি না হয়, তবে উপরের কমান্ড সিকোয়েন্সের আচরণের কীভাবে ব্যাখ্যা করা যেতে পারে?
Q3: শেষ অবধি, এমন কোনও দৃশ্য আছে যেখানে এই পরিবর্তনশীলটি বাস্তবে অর্থবহভাবে ব্যবহার করা যেতে পারে? আমি আসলে মধ্যে এটি ব্যবহার করার চেষ্টা ছিল $PROMPT_COMMAND
কারণ তাড়াতাড়ি, আমার মধ্যে হিসাবে, কমান্ড মৃত্যুদন্ড কার্যকর করা হচ্ছে বিশ্লেষণ (এবং যে উপর নির্ভর করে কিছু উপাদান না), কিন্তু আমি পারব না $PROMPT_COMMAND
, আমি একটি কমান্ড চেহারায় পরিবর্তনশীল সময়ে চালানো $BASH_COMMAND
পরিবর্তনশীল কমান্ড সেট হয়ে যায়। এমনকি যখন আমি MYVARIABLE=$BASH_COMMAND
আমার শুরুতে ঠিক তখনই করি $PROMPT_COMMAND
, তারপরে MYVARIABLE
স্ট্রিংটি থাকে MYVARIABLE=$BASH_COMMAND
কারণ একটি অ্যাসাইনমেন্টও একটি কমান্ড। (এই প্রশ্নটি কীভাবে আমি $PROMPT_COMMAND
মৃত্যুদণ্ড কার্যকর করার মধ্যে কীভাবে বর্তমান কমান্ডটি পেতে পারি তা সম্পর্কে নয় ways অন্যান্য উপায় আছে, আমি জানি))
এটি হাইজেনবার্গের অনিশ্চয়তার নীতিমালার মতো কিছুটা। কেবল পরিবর্তনশীল পর্যবেক্ষণ করে, আমি এটি পরিবর্তন করি।
bash
über-গুরু রয়েছে।