একটি অনুরূপ প্রশ্ন রয়েছে যা 'মোড়ানো' দৃশ্যের সাথে সম্পর্কিত, যেখানে আপনি উদাহরণস্বরূপ cd
একটি আদেশের মাধ্যমে প্রতিস্থাপন করতে চান যা বিল্টিনকে কল করেcd
।
তবে শেলশক এট আলের আলোকে এবং জেনে যে বাশ পরিবেশ থেকে ফাংশন আমদানি করে, আমি কয়েকটি পরীক্ষা করেছি এবং আমি বিল্টিনকে নিরাপদে কল করার কোনও উপায় খুঁজে পাই না cd
আমার স্ক্রিপ্ট থেকে ।
এই বিবেচনা
cd() { echo "muahaha"; }
export -f cd
এই পরিবেশে যে কোনও স্ক্রিপ্টগুলি ব্যবহার করে cd
কলগুলি ভেঙে যাবে (এমন কোনও কিছুর প্রভাব বিবেচনা করুন)cd dir && rm -rf .
)।
কমান্ডের প্রকারটি পরীক্ষা করার জন্য কমান্ড রয়েছে (সুবিধাজনকভাবে বলা হয় type
) এবং কোনও ফাংশন ( builtin
এবং command
) এর পরিবর্তে বিল্টিন সংস্করণ চালানোর জন্য কমান্ড রয়েছে । তবে দেখুন এবং দেখুন, এগুলি পাশাপাশি ফাংশন ব্যবহার করে ওভাররাইড করা যেতে পারে
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
নিম্নলিখিত উত্পাদন করবে:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
বিল্টিন কমান্ডটি ব্যবহার করার জন্য বাশকে নিরাপদে জোর করার কোনও উপায় আছে কি না, বা কমপক্ষে সনাক্ত করতে হবে যে কোনও কমান্ড কোনও বিল্টিন নয়, পুরো পরিবেশটি পরিষ্কার না করেই?
আমি বুঝতে পেরেছি যে কেউ যদি আপনার পরিবেশ নিয়ন্ত্রণ করে তবে আপনি সম্ভবত কোনওভাবেই বিভ্রান্ত হয়ে পড়েছেন, তবে কমপক্ষে এলিয়াসগুলির জন্য আপনি এর \
আগে একটি tingোকিয়ে উপন্যাসটি কল না করার বিকল্প পেয়েছেন ।
env
কোনও ফাংশন হিসাবে পুনরায় সংজ্ঞায়িত না হয়। এটা ভয়াবহ। আমি প্রথমে ভেবেছিলাম যে বিশেষ অক্ষরগুলি সহায়তা করবে - সম্পূর্ণ পথের সাথে কল /
করা .
যা উত্সটি ব্যবহার করে, এবং আরও অনেক কিছু। তবে এগুলি ফাংশন নামের জন্যও ব্যবহার করা যেতে পারে! আপনি যে কোনও ফাংশন চান তা পুনরায় সংজ্ঞায়িত করতে পারেন, তবে আসল কমান্ডে কল করা ফিরে পাওয়া শক্ত।
#/bin/sh
যদি এটি ডিফল্ট ইন্টারেক্টিভ শেল নয়।
env
আগে কমান্ডটি ব্যবহার করে আপনার স্ক্রিপ্টটি চালাতে পারেন :env -i <SCRIPT.sh>