BASH এর $ PROMPT_COMMAND এর সমতুল্য কি?


24

BASH একটি $PROMPT_COMMANDপরিবেশের পরিবর্তনশীলকে সমর্থন করে যা কোনও প্রথম স্তরের ইন্টারেক্টিভ প্রম্পটের আগে নির্বাহের জন্য একটি আদেশকে নির্ধারণ করে। আমি এর একটি ZSH সমতুল্য খুঁজছি।

ডকুমেন্টেশন বলছে যে একটি ক্রিয়া আছে যা precmdআমি অর্জন করতে সংজ্ঞায়িত করতে পারি; তবে, পরিবেশের পরিবর্তনশীল থেকে এটি কীভাবে সংজ্ঞায়িত করা যায় তা সম্পর্কে আমার কোনও ধারণা নেই।

আমি পরিবেশের পরিবর্তনশীল পাস করার বিষয়টি বিবেচনা করেছি যা জেডএসএইচটিকে সেই ফাংশনের সংজ্ঞা সম্বলিত একটি ফাইল পড়তে বাধ্য করবে, তবে জেডএসএইচ এই জাতীয় জিনিসগুলিকে সমর্থন করে না বলে মনে হয় : এটি কেবল গ্লোবাল ফাইলগুলি এবং তারপরে প্রতি ব্যবহারকারী ফাইলগুলি পড়ে। আমি সেগুলি প্রতিস্থাপন করতে পারি তবে আমি ফাইলগুলি পরিবর্তন না করে এগুলিতে যুক্ত করতে পারি না, যা আমি করতে পারি না।

সুতরাং আমি কীভাবে পরিবেশের ভেরিয়েবলের মাধ্যমে জেডএসএইজে প্রাক-প্রম্পট হুক সংজ্ঞায়িত করব, যেমন আমি $PROMPT_COMMANDবাসে ব্যবহার করব ?


সত্যি বলতে গেলে, আমার একটি ইন্টারেক্টিভ-কমান্ড-এক্সিকিউশন হুক দরকার, তবে শেল একটিও সরবরাহ করে না তাই আমাকে প্রি-প্রম্পট হুকের আশ্রয় নিতে হবে - এগুলি আমার কাছে যতটা কাছাকাছি পাওয়া যায় বলে মনে হয়।
Shnatsel

1
এইচএম, আমি ভাবছি, পোস্ট-ইন্টারেক্টিভ-কমান্ড-এক্সিকিউশন এবং প্রাক-প্রম্পটের মধ্যে পার্থক্য কী। একটি ধারণাগত পার্থক্য ছাড়াও, আপনি প্রকৃতপক্ষে কোনও পার্থক্যটি কোথায় পর্যবেক্ষণ করেন। (আসুন কমান্ডগুলি বাদ দিন exitএবং execঠিক আছে ;))
এমপি 5

@ এমপি একটি পটভূমি কাজ চালানোর সময় একটি পার্থক্য আছে, কারণ পটভূমি কাজ প্রম্পট ক্রম থেকে স্বাধীন।
Shnatsel

1
ঠিক আছে, আমি পয়েন্ট পেয়েছি। সুতরাং, কীভাবে এরকম কিছু সম্পর্কে: start() { eval "$@"; echo post-command-code }এবং তারপরে কমান্ড লাইনটি প্রিপেন্ডড দিয়ে কার্যকর করতে একটি জেল-বাইন্ডিং ব্যবহার করবেন start?
এমপিপি

1
DEBUGফাঁদ একটা চমৎকার খুঁজতে, কিন্তু আপনি এখনও সমস্যা কিভাবে এটি সংজ্ঞায়িত করতে হবে। আমি আমার উত্তরটি আরও একবার প্রসারিত করেছি, তবে DEBUG ফাঁদ সমাধান সম্পর্কে আপনার নিজের উত্তর লিখতে আমি এটি ছেড়ে দিয়েছি। :)
এমপিপি

উত্তর:


24

$PROMPT_COMMANDআমার মনে যে বাশগুলির অনুকরণ করা যায় তার সর্বাধিক সহজ পদ্ধতির precmdহুক ব্যবহার করা যেমন আপনি ইতিমধ্যে বুঝতে পেরেছেন। এটি হিসাবে সংজ্ঞায়িত করুন

precmd() { eval "$PROMPT_COMMAND" }

এবং আপনি এর মতো কিছু করতে পারেন:

$ PROMPT_COMMAND='echo Hello, it is now $(date)'
Hello, it is now Mon, Mar 31, 2014 7:08:00 PM
$ whoami      
user
Hello, it is now Mon, Mar 31, 2014 7:08:21 PM     
$

উদাহরণস্বরূপ একক উদ্ধৃতিগুলি নোট করুন, অন্যথায় $(date)খুব তাড়াতাড়ি প্রসারিত হবে, যেমন ইতিমধ্যে সংজ্ঞা $PROMPT_COMMANDদেওয়ার সময় এবং প্রম্পটের আগে ডাকা হবে না তখন।


আপনি যদি বিদ্যমান সংজ্ঞাটি সংরক্ষণ করতে (এবং পরিবর্তন করতে চান না) চান তবে আপনি এই পদ্ধতির ব্যবহার করতে পারেন:

$ prmptcmd() { eval "$PROMPT_COMMAND" }
$ precmd_functions=(prmptcmd)

এটির সাথে prmptcmdফাংশনগুলি বিদ্যমান precmd()ফাংশনের পরে কার্যকর করা হয় ।


পরিশেষে, এখানে একটি প্যাকেজ যা কোনও প্রোগ্রাম প্যাকেজে ব্যবহারের জন্য উপযুক্ত, এটির দ্বারা ব্যবহারকারী বা সিস্টেম ফাইলগুলি পরিবর্তন করা উচিত নয় এবং ইন্টারেক্টিভ কমান্ডগুলি প্রবেশ করতে পারে না।

বাশ সেশন স্প্যান করার উদাহরণ হতে পারে

PROMPT_COMMAND="echo foo" bash

স্পেন zsh আপনি ব্যবহার করতে পারেন

ZDOTDIR=/program/dir zsh

যা /program/dir/.zshrcউত্সাহিত করে তোলে । এই ফাইলটিতে precmd()হুককে উপরে বর্ণিত হিসাবে সংজ্ঞায়িত করা যেতে পারে। আপনি যদি ব্যবহারকারীর সেটিংসে চান ছাড়াও অন্তর্ভুক্ত source $HOME/.zshrc, খুব প্রোগ্রামের .zshrc ইত্যাদি। প্রোগ্রাম ডিরেক্টরি থেকে বাইরের কোনও ফাইল পরিবর্তিত না হওয়ায় এই সেটআপটি রক্ষণযোগ্য।


একটি শেষ সংযোজন হিসাবে, এখানে নতুন ব্যবহারকারীর স্বাগত রাখার উপায় ধারণার একটি প্রমাণ। আপনার /program/dir/.zshenvআরসি কনফিগারেশন ফাইলে নিম্নলিখিত কোডটি ব্যবহার করুন:

echo define precmd, traps, etc.

autoload -Uz zsh-newuser-install

if [[ ! -e "$HOME/.zshrc" ]]; then
  zsh-newuser-install -f
  mv $ZDOTDIR/.zshrc $HOME/.zshrc
else
  builtin source $HOME/.zshrc
fi

এটাই আমি বুঝতে পেরেছি। সমস্যাটি হ'ল - পরিবেশের পরিবর্তনশীলের মাধ্যমে আমি কীভাবে প্রাক্কৃত হুক সংজ্ঞায়িত করব? ফাইল পরিবর্তন না করে হুক বা কোড যুক্ত করার জন্য কি কোনও ব্যবস্থা আছে? বা কীভাবে আমি কমপক্ষে এটি বিশ্বব্যাপী এবং ব্যবহারকারী-গ্লোবাল ".zprofile" এবং অনুরূপ ফাইলগুলিতে না লিখে এটি করব? পছন্দ করুন, আমি কি আমার নিজের .z প্রোফাইলে যুক্ত করতে পারি যা বিদ্যমানগুলি প্রতিস্থাপন করবে না?
Shnatsel

1
এছাড়াও এখানে আপনার প্র্যাকমডি হুকের ব্যবহার যে কোনও প্রকারের বিদ্যমান পূর্ববর্তী প্রাক হুক প্রতিস্থাপন করবে; zsh ডক্স উল্লেখ করেছে যে আমি ফাংশনগুলির একটি অ্যারে তৈরি করতে পারি যা সহাবস্থানে থাকবে তবে কীভাবে করব তা আমার কোনও ধারণা নেই।
Shnatsel

1
(1) আপনি কীভাবে পরিবেশের পরিবর্তনশীল মাধ্যমে প্র্যাকমডি হুক সংজ্ঞায়িত করবেন এর অর্থ কী ? আমি যে উদাহরণটি উপস্থাপন করেছি তা আইএমএইচও-তে বাশ প্রক্রিয়াটির মতো কাজ করে। (২) আপনি কমান্ড-লাইনের মাধ্যমে হুকটি যুক্ত করতে পারেন তবে তা স্থায়ী নয়। আপনার সংশোধন করতে সমস্যা কি .zshrc? (3) একটি উদাহরণ: foo() { echo foo }; bar() { echo bar }; precmd_functions=(foo bar)এই, executes foo()এবং bar() ছাড়াও করার precmd()
এমপি 3

2
ঠিক আছে, এটি অনেক কিছুই স্পষ্ট করে - বাশের জন্য একটি ন্যূনতম উদাহরণটি তখন হবে PROMPT_COMMAND="echo foo" bash, তাই না? Zsh ডিম ছাড়ার জন্য এই একটি সম্ভাবনা হল: ZDOTDIR=/program/dir zsh। তারপরে /program/dir/.zshrcসূচনা হয় যেখানে আপনি পূর্ববর্তী () হুক সংজ্ঞায়িত করতে পারেন। আপনি যদি ব্যবহারকারীর সংযোজন করতে চান source $HOME/.zshrcতবে প্রোগ্রামের zshrc এ অন্তর্ভুক্ত করুন। এটি রক্ষণাবেক্ষণ করা সহজ হওয়া উচিত, কারণ প্রোগ্রাম ডিয়ারের বাইরে কোনও ফাইল সংশোধিত হয় না।
এমপিপি

1
@ স্ননাটসেল: আমি আমার উত্তরটি প্রসারিত করেছি। আপনার মন্তব্যগুলি থেকে অতিরিক্ত তথ্য অন্তর্ভুক্ত করার জন্য আপনি সম্ভবত নিজের প্রশ্নটি সম্পাদনা করতে পারেন।
এমপিপি

5

@ মাইপি যেমন বলেছে, জেডএস-এর precmdকাজ বাশের মতো একই রকম কাজ করে PROMPT_COMMAND

এখানে একটি উদাহরণ যা বাশ বা জেডের জন্য কাজ করে এবং ব্যবহার করে না eval:

## ~/myprompt.sh

# 'ZSH_VERSION' only defined in Zsh
# 'precmd' is a special function name known to Zsh

[ ${ZSH_VERSION} ] && precmd() { myprompt; }

# 'BASH_VERSION' only defined in Bash
# 'PROMPT_COMMAND' is a special environment variable name known to Bash

[ ${BASH_VERSION} ] && PROMPT_COMMAND=myprompt

# function called every time shell is about to draw prompt
myprompt() {
  if [ ${ZSH_VERSION} ]; then
    # Zsh prompt expansion syntax
    PS1='%{%F{red}%}%n%{%f%}@%{%F{red}%}%m %{%F{cyan}%}%~ %{%F{white}%}%# %{%f%}'
  elif [ ${BASH_VERSION} ]; then
    # Bash prompt expansion syntax
    PS1='\[\e[31m\]\u\[\e[0m\]@\[\e[31m\]\h \[\e[36m\]\w \[\e[37m\]\$ \[\e[0m\]'
  fi
}

শেল init স্ক্রিপ্টগুলি থেকে চালান:

## ~/.bashrc
. ~/myprompt.sh

এবং:

## ~/.zshrc
. ~/myprompt.sh

এখানে অনুরোধগুলি কেবল উদাহরণ। একটি স্পষ্টতই অনেক কৌশলযুক্ত জিনিস করতে পারেন।

প্রম্পট ফাংশনগুলি নির্ধারণের বিশদের জন্য দেখুন: http://zsh.sourceforge.net/Doc/Re कृपया / Function.html# index-precmd এবং http://www.gnu.org/software/bash/manual/bashref.html # মুদ্রণ-এ-প্রম্পট

প্রম্পট সম্প্রসারণের বিশদগুলির জন্য, দেখুন http://zsh.sourceforge.net/Doc/Re कृपया /Prompt- Expansion.html এবং http://www.gnu.org/software/bash/manual/bashref.html# মুদ্রণ- একটি -প্রম্পট

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