আমি সিডি কমান্ড হুক করতে পারি?


9

আমি যে সার্ভারটি চালাচ্ছি সেটিতে কিছু সেট করার চেষ্টা করছি, যখনই আমি যখন cdকোনও public_htmlফোল্ডারে 95% সময় থাকি তখন কয়েকটি কমান্ড থাকে আমি সবসময় নির্দিষ্ট কিছু বিষয় যাচাই করার জন্য চালাব।

cdডিরেক্টরিটি যদি একটি হয় তবে আমি কীভাবে হুক করতে পারি সেখানে public_htmlএটি স্বয়ংক্রিয়ভাবে আমার জন্য কমান্ডগুলি চালিত করবে?

আমি যদি cdকমান্ডটি হুক করতে না পারি, তার পরে আমি যে ফলাফলটি পাচ্ছি তা অর্জনের জন্য আমি কী করতে পারি?

আমি CentOS 5.8 চালাচ্ছি।

উত্তর:


12

আপনি এই ফাংশনটি আপনার .bashrcবা অন্যান্য স্টার্টআপ ফাইলটিতে যুক্ত করতে পারেন (আপনার শেলের উপর নির্ভর করে)।

cd() {      
   if [ "$1" = "public_html" ]; then
      echo "current dir is my dir"
   fi
   builtin cd "$1"
}

ওহ, এটি আকর্ষণীয় দেখায়। আমি এটি আমার .বাশ_ প্রোফাইলে যুক্ত করেছি এবং echo "Testing..."ইফের উপরে কিন্তু নোটিং আউটপুট যুক্ত করেছি। এই পরিবর্তনগুলি প্রয়োগ করতে আমার কি কিছু করা দরকার?
টিএমএইচ

@ টমহার্ট যদি আপনি কোনও নতুন অধিবেশন শুরু না করেন তবে আপনার বর্তমান সেশনে ফাইলটি উত্স করতে হবে. ~/.bash_profile
ইউভিভি

@ টম হার্ট দেখে মনে হচ্ছে /bin/cdআমার সেন্টোজে কোনও নেই , সুতরাং এই সমাধানটি কার্যকর হতে পারে না
ইউভিভি ২

আমি এখন এটি লক্ষ্য করেছি। আমি এই প্রশ্নটি পেয়েছি যার মধ্যে বলা হয়েছে কেন ইউনিক্স.স্ট্যাকেক্সেঞ্জা.কম / প্রশ্ন / ১১696955৫ / কোথাও-is-cd- তালিকায় রয়েছে । সিস্টেমের জন্য এখনও একটি ভাল সমাধান যা আসলে একটি / বিন / সিডি থাকলেও :)।
টিএমএইচ

1
কাজ না করে তাহলে আপনি cd -P public_htmlবা cd ~/public_htmlবা অপ্রত্যাশিত আচরণ যদি আপনি করতে পারেন না আছে cdমধ্যে public_html
স্টাফেন চেজেলাস

17

সহ kshবা bash(বা zsh):

cd() {
  builtin cd "$@" || return
  [ "$OLDPWD" = "$PWD" ] || case $PWD in
      (*/public_html) echo do something
    esac
}

সহ zsh:

chpwd()
  case $PWD in
    (*/public_html) echo do something
  esac

( chpwdএকটি হল হুক ফাংশন বলা হয় যে যখনই সাম্প্রতিক কাজ করা সংগ্রহের প্রণালী দ্বারা পরিবর্তিত করে ( cd, pushd, popd...))।


3

cdএকটি বিদ্যমান কমান্ড মোড়ানোর পরামর্শ দেওয়া হয় না।

আরও একটি সার্বজনীন সমাধান chpwdবাশে একটি কাস্টম হুক সংজ্ঞায়িত করা হবে । (এই প্রশ্নের ট্যাগ অনুসারে, আমি ধরে নিচ্ছি আপনি বাশ ব্যবহার করছেন)

অন্যান্য আধুনিক শাঁসের সাথে তুলনা করার সময় বাশে ডিজাইনের একটি সম্পূর্ণ হুক সিস্টেম নেই। PROMPT_COMMANDভেরিয়েবল হুক ফাংশন হিসাবে ব্যবহৃত হয় precmd, fish_promptএটি ফিশে জেডএসএইচ হুকের সমতুল্য । আপাতত, জেডএসএইচ হ'ল একমাত্র শেল যা আমি জানলাম তার একটি chpwdহুক বিল্টিন রয়েছে।

PROMPT_COMMAND

যদি সেট করা থাকে, প্রতিটি প্রাথমিক প্রম্পট ($ পিএস 1) মুদ্রণের আগে কার্যকর করতে একটি আদেশ হিসাবে মানটিকে ব্যাখ্যা করা হয়।

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-Variables

chpwd হুশ ইন বাশ

chpwdভিত্তিতে বাশের সমতুল্য হুক সেটআপ করার জন্য একটি কৌশল সরবরাহ করা হয় PROMPT_COMMAND

# create a PROPMT_COMMAND equivalent to store chpwd functions
typeset -g CHPWD_COMMAND=""

_chpwd_hook() {
  shopt -s nullglob

  local f

  # run commands in CHPWD_COMMAND variable on dir change
  if [[ "$PREVPWD" != "$PWD" ]]; then
    local IFS=$';'
    for f in $CHPWD_COMMAND; do
      "$f"
    done
    unset IFS
  fi
  # refresh last working dir record
  export PREVPWD="$PWD"
}

# add `;` after _chpwd_hook if PROMPT_COMMAND is not empty
PROMPT_COMMAND="_chpwd_hook${PROMPT_COMMAND:+;$PROMPT_COMMAND}"

আমরা সনাক্ত করছি যেহেতু PWDসরাসরি পরিবর্তন, সমাধান সঙ্গে কাজ করে cd, pushdএবং popd

দ্রষ্টব্য : chpwdবাশ এবং chpwdজেডএসএইচে আমাদের বাস্তবায়নটির মধ্যে প্রধান পার্থক্যটি PROMPT_COMMANDএকটি অ ইন্টারেক্টিভ বাশ শেলের সমর্থিত নয়।

ব্যবহার

_public_html_action() {
  if [[ $PWD == */public_html ]]; then
    # actions
  fi
}

# append the command into CHPWD_COMMAND
CHPWD_COMMAND="${CHPWD_COMMAND:+$CHPWD_COMMAND;}_public_html_action"

উত্স: আমার গিস্ট থেকে বাশে chpwd সমতুল্য হুক তৈরি করুন

যে কেউ জেডএসএইচের জন্য উত্তর চান। chpwdজেডএসএইচ হুক ব্যবহার করুন । সরাসরি ফাংশন সংজ্ঞায়িত করবেন না chpwd() আরও বিশদ এখানে


1

আমি বাশ বিশেষজ্ঞ নই তবে আমি @ ইউভিভি এর উত্তর নেব এবং কেবল এটি সামান্য পরিবর্তন করব যাতে এটি এটি করে:

  • অনুসন্ধানের পরিবর্তে public_html, আমি কেবল hook-scriptলক্ষ্য দির কিছু ফাইল পরীক্ষা করে $1বলব, বলুন cd_hook.sh
  • যদি এটি hook-scriptবিদ্যমান থাকে তবে এটি চালান, এবং এর সাথে এগিয়ে যানcd

এটি আরও জেনেরিক বলে মনে হচ্ছে কারণ আপনি cdকেবলমাত্র ডিরেক্টরি ডিরেক্টরিতে একটি যুক্ত করে যদি আপনি পছন্দ করেন তবে কোনও ডিরেক্টরিতে হুক প্রয়োগ করতে সক্ষম হবেন cd_hook.sh


3
এটি জেনেরিক বলে মনে হচ্ছে তবে আপনি সুরক্ষার দুর্বলতা প্রবর্তন করছেন। আপনি যে কোনও কোড পরের বার সিডি করার সময় আপনাকে কোনও কোড চালানোর জন্য কাউকে বা অন্য কোনও কিছুকে কেবল / টিএমপি-তে একটি হুক স্ক্রিপ্ট লাগানো দরকার। আপনি কমপক্ষে এটি নিশ্চিত করতে চাইবেন যে হুক স্ক্রিপ্ট আপনার মালিকানাধীন, একটি সিমলিংক নয়, আপনি ব্যতীত অন্য কারও দ্বারা লিখিত নয়, যে ডিরেক্টরিটি এটিতে রয়েছে কেবল এটি আপনার দ্বারা লিখিত হয় ... দেখুন প্রতি কার্যকারী ডিরেক্টরিতে ইতিহাস রেখে (প্রতি শেল সেশন প্রতি সিএফ) একটি নিরাপদ পদ্ধতির জন্য।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস সুরক্ষার অন্তর্দৃষ্টি জন্য ধন্যবাদ। আমাকে স্বীকার করতে হবে আমি এটি সম্পর্কে ভেবেও দেখিনি।
হারিয়ে গেছে এবং খুঁজে পাওয়া

আমি কেবল এটি করতে গিয়ে এই প্রশ্নটি পেয়েছি: আমি যদি cdঅন্য কোথাও থাকি তবে কোনও .bashcdফাইল অনুসন্ধান করুন এবং এটি উপস্থিত থাকলে চালনা করুন।
DarkWiiPlayer

0

ব্যাশে শক্তিশালী zsh পদ্ধতির ব্যবহার:

বাশ প্রসারিত করার প্রথম সহজ উপায়:

~ / .Runscripts

#load all scripts inside $1 dir

run_scripts()
{
    for script in $1/*; do

        # skip non-executable snippets
        [ -f "$script" ] && [ -x "$script" ] || continue

        # execute $script in the context of the current shell
        . $script
    done
}

.Bashrc এ অন্তর্ভুক্ত করুন:

. ~/.run_scripts

run_scripts ~/.bashrc.d

আপনি এর সাথে ~ / .bashrc.d / cdook তৈরি করতে পারেন:

#!/bin/bash

chpwd() {
  : #no action
}

cd() {      
   builtin cd $1
   chpwd $1
}

ফাংশনটি প্রতিস্থাপন করার জন্য এখন আপনার উপর নির্ভরশীল:

#list files after cd
chpwd() {
  ls -lah --color
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.