cdコマンドを接続できますか?

cdコマンドを接続できますか?

私は実行中のサーバーに何かを設定しようとしていますが、フォルダcdに入ったときpublic_htmlに95%の時間にわたって何かを確認するためにコマンドを実行します。

とにかく、ディレクトリが自動的にコマンドを実行cdするように接続できますか?public_html

そのコマンドに接続できない場合は、cd目的の結果を得るために他の方法がありますか?

私はCentOS 5.8を使用しています。

答え1

そして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、、...を介して)呼び出される関数pushdpopd

答え2

この機能を自分または他の起動ファイルに追加できます.bashrc(シェルによって異なります)。

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

答え3

cd既存のコマンド Wrapping の使用は廃止されました。

より一般的な解決策は、chpwdBashでカスタムフックを定義することです。 (この質問のタグに基づいてBashを使用しているとします。)

他の最新のシェルと比較して、Bashは完全なフックシステムとして設計されていません。変数はフック関数として使用され、ZSHおよびFishのフックPROMPT_COMMANDと同じです。現在、ZSHは私が知っている内蔵フックを持つ唯一のシェルです。precmdfish_promptchpwd

プロンプトコマンド

設定されている場合、この値は各デフォルトプロンプト($ PS1)を印刷する前に実行されるコマンドとして解釈されます。

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

chpwdBashのフック

chpwd.NETベースのBashでこれを行うためのトリックを提供します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変更を直接検出するため、このソリューションは、およびcdpushd動作しますpopd

ノートchpwd:BashとZSHの実装の主な違いは、非対話型Bashシェルではサポートされていないこと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"

源泉:Bashでchpwdと同等のHookを生成する私のポイントで。

ZSHへの答えが欲しい人のために。chpwdZSHでフックを使用。関数を直接定義しないでくださいchpwd() 詳しくはこちら

答え4

Bashで強力なzshメソッドを使用してください。

まず、bashを拡張する簡単な方法は次のとおりです。

~/.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/cdhook を生成できます。

#!/bin/bash

chpwd() {
  : #no action
}

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

今、関数を置き換えるのはあなた次第です。

#list files after cd
chpwd() {
  ls -lah --color
}

関連情報