zsh কিছু দুর্দান্ত হুক ফাংশন সরবরাহ করে যার chpwd
সাথে ব্যবহারকারী ডিরেক্টরি পরিবর্তনের পরে কোনও ফাংশন চালায়।
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
আমি বাশ এ অনুকরণ করার চেষ্টা করছি।
সীমাবদ্ধতাসমূহ:
- এটি অবশ্যই ইন্টারেক্টিভ এবং অ-ইন্টারেক্টিভ উভয় শেলগুলিতে কাজ করবে, যা আমার মনে হয় এর অর্থ এটি কোনওরকম কোনও কিছুর উপর নির্ভর করতে পারে না
$PROMPT_COMMAND
- এটি পুনরায় সংজ্ঞা দিতে পারে না
cd
, কারণ আমি এটি ডিরেক্টরিতে পরিবর্তিত কোনও আদেশের জন্য কাজ করতে চাই (যেমন,pushd
এবংpopd
) - এটা তোলে চলবে পর , ব্যবহারকারীর কমান্ড তাই
trap "my_function" DEBUG
, না কাজ করে, যদি না আমি একরকম সেখানে বলতে পারেন "প্রথমবার চালনার$BASH_COMMAND
, আমরা আটকা পড়ে তারপর এছাড়াও এই কাজ ..." আমি দেখতে যে আমি স্বয়ংক্রিয় চলমান এড়াতে পারেন এর$BASH_COMMAND
যদিextdebug
সক্রিয় করা হয় এবং ট্র্যাপ ফাংশনটি 1 প্রদান করে, তবে আমি মনে করি না যে আমি জোর করতে চাইextdebug
এবং1
সফল (তবে পরিবর্তিত) কমান্ডের জন্য ফিরে আসা ভুল বলে মনে হচ্ছে।
শেষ অংশ - "ব্যবহারকারীর আদেশের পরে চলুন" - এটিই আমাকে স্ট্যাম্প করেছে। আমি করতে প্রতিটি কমান্ড পর একটি ফাংশন চালানোর জন্য, আমি এটি পরীক্ষা যেহেতু আমরা শেষ পরীক্ষিত ডিরেক্টরির পরিবর্তিত হয়েছে কিনা থাকতে পারে। উদাহরণ:
function check_pwd() {
# true in a new shell (empty var) or after cd
if [ "$LAST_CHECKED_DIR" != "$PWD" ]; then
my_function
fi
LAST_CHECKED_DIR=$PWD
}
আমি কি সঠিক পথে রয়েছি, না এর থেকে আরও ভাল উপায় আছে? ব্যবহারকারীর ডিরেক্টরি পরিবর্তন করার পরে আমি কীভাবে বাশে কমান্ড চালাতে পারি?
cd
একটি নীতি হিসাবে পুনরায় সংজ্ঞায়িত না করে তালিকাভুক্ত করেছেন ।
MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )
দয়া করে বিশ্বস্ত ইউনিক্স আদেশগুলি পরিবর্তন করবেন না।
bash
, যা এটি চলমান সমস্ত অপারেটিং সিস্টেমের ক্ষেত্রে একই রকম কাজ করে।
cd
,pushd
এবংpopd
? ডিরেক্টরি পরিবর্তন করার জন্য আরও কতগুলি উপায় আছে?