$ পিডাব্লুডিতে কোনও পরিবর্তন আসার পরে আমি কীভাবে বাশে কমান্ড চালাতে পারি?


10

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
}

আমি কি সঠিক পথে রয়েছি, না এর থেকে আরও ভাল উপায় আছে? ব্যবহারকারীর ডিরেক্টরি পরিবর্তন করার পরে আমি কীভাবে বাশে কমান্ড চালাতে পারি?


3
কেন পুনরায় সংজ্ঞায়িত না cd, pushdএবং popd? ডিরেক্টরি পরিবর্তন করার জন্য আরও কতগুলি উপায় আছে?
jw013

@ jw013 এই কোডটি একটি ওপেন সোর্স প্রকল্পে যাওয়ার উদ্দেশ্যে করা হয়েছে যেখানে রক্ষণাবেক্ষণকারী নির্দিষ্টভাবে cdএকটি নীতি হিসাবে পুনরায় সংজ্ঞায়িত না করে তালিকাভুক্ত করেছেন ।
নাথান লং

এছাড়াও - "ডিরেক্টরি পরিবর্তন করার জন্য আরও কতগুলি উপায় আছে" - আমি জানি না, এটি অন্য কারণ যা আমি তাদের সুস্পষ্টভাবে তালিকাভুক্ত করার উপর নির্ভর করতে পছন্দ করি না।
নাথান লং

আপনি কেন এটা করতে চান? আপনার ফাংশন প্রচুর প্রোগ্রাম ব্রেক করতে পারে (সি, জাভা, ..)। স্ক্রিপ্টগুলিতে আমি ব্যবহার করি MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )দয়া করে বিশ্বস্ত ইউনিক্স আদেশগুলি পরিবর্তন করবেন না।
ওয়াল্টার এ

1
@ নাথানলং এটি কেবলমাত্র আমার অপারেটিং সিস্টেমের জন্য । অপারেটিং সিস্টেমটি এখানে অপ্রাসঙ্গিক বলে মনে হচ্ছে। ওএস কি ব্যাপার? এটি আপনার প্রশ্নে গুরুত্বপূর্ণ শেল এবং আপনি বিশেষত জিজ্ঞাসা করছেন বলে মনে হচ্ছে bash, যা এটি চলমান সমস্ত অপারেটিং সিস্টেমের ক্ষেত্রে একই রকম কাজ করে।
jw013

উত্তর:


2

এই প্রতিবন্ধকতাগুলি পূরণ করার কোনও উপায় নেই

দেখে মনে হচ্ছে আমার বাধা দিয়ে এই সমস্যাটি সমাধান করার কোনও উপায় নেই। সাধারণভাবে, সম্ভাব্য সমাধানগুলি হ'ল:

  • ওভাররাইড cd, pushdএবং popd, যাতে কোনও কমান্ড যা ডিরেক্টরি পরিবর্তন করে তা হুক ফাংশনটি প্রথমে চালিত করে। তবে এটি সমস্যা তৈরি করতে পারে কারণ 1) ওভাররাইডটি অবশ্যই মূল কমান্ডের মতো ট্যাবটি সম্পূর্ণরূপে সতর্ক হওয়া উচিত এবং একই প্রস্থান কোডটি ফেরত দিতে হবে এবং ২) যদি একাধিক সরঞ্জাম এই পদ্ধতি গ্রহণ করে তবে তারা একসাথে ভাল খেলতে পারে না
  • প্রথমে হুক ফাংশনটি চালানোর জন্য পরিবেশ পরিবর্তনের সাথে চালিত সমস্ত কমান্ডকে ওভাররাইড করুন। এটি শক্ত কারণ এই জাতীয় অনেক কমান্ড রয়েছে
  • trap 'my_functionডিবাগ so that every command will run the hook function. This is suboptimal because 1) it runs before every command, 2) it runs *before*সিডি, 3 এর পরে নয়) কেবল একটি ডিবাগ ফাংশন থাকতে পারে, সুতরাং অন্য কোনও সরঞ্জাম যদি এই পদ্ধতির ব্যবহার করে তবে তারা একসাথে ভাল খেলতে পারে না
  • $PROMPT_COMMANDপ্রথমে হুক ফাংশনটি চালানোর জন্য পুনরায় সংজ্ঞা দিন । এটি সাবঅপটিমাল কারণ এটি অ-ইন্টারেক্টিভ শেলগুলিতে কাজ করবে না এবং কারণ যদি অন্য কোনও সরঞ্জাম প্রম্পট কমান্ডটি সংজ্ঞায়িত করে তবে তারা ভালভাবে খেলতে পারে না।

সংক্ষেপে এটি মনে হয় একমাত্র দুর্দান্ত সমাধান হ'ল যদি বাশ জ্যাশেলের chpwd_functionsহুকের মতো কিছু সরবরাহ করে তবে এটি সঠিকভাবে অনুকরণ করা অসম্ভব বলে মনে হয়।


1

যদি রক্ষণাবেক্ষণকারী আপনার সিডির সংজ্ঞা পরিবর্তন করতে পছন্দ না করে তবে অন্য বিকল্পটি হ'ল এই ডিরেক্টরিটি ইন-ডিরেক্টরি পরিবেশ ব্যবহার করে এমন সমস্ত কমান্ডকে নতুন করে সংজ্ঞায়িত করা হবে:

for c in cmd1 cmd2 cmd3 cmd4 cmd5 ; do
    eval "$c() { check_pwd ; command $c \"\$@\" ; }"
done

এটি বেশ কার্যকর হবে কারণ প্রয়োজনের সময় PWD হুক এবং ইন-ডিরেক্টরি কনফিগারেশন কেবল প্রক্রিয়া করা হবে।

আপনার উদাহরণে check_pwd ফাংশনে, আমি পরিবর্তন করতে পারি:

my_function

প্রতি:

my_function "$PWD"

নতুন সিডব্লিউডিতে পাস করার জন্য (আরও মডিউলার, পরীক্ষামূলক হতে পারে)।


"এই ডিরেক্টরিতে পরিবেশ ব্যবহার করে এমন সমস্ত কমান্ড পুনরায় সংজ্ঞায়িত করুন" দুর্ভাগ্যক্রমে, আমি এটি পূর্বাভাস দিতে পারি না।
নাথান লং

0

আপনার বিতরণ অনুযায়ী ইনোটাইফাই-সরঞ্জামগুলি ইনস্টল করুন ।

inotifywait -emodify,create,delete -m /path/to/directory | while read line; do service httpd reload; done

আমার উদাহরণে নিম্নলিখিত ডিরেক্টরিটিতে httpdকোনও পরিবর্তন (সংশোধন, তৈরি, মুছুন) পরিবর্তন হলে নিম্নলিখিত কমান্ডটি পুনরায় চালু হবে ।

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