cd 명령을 연결할 수 있나요?

cd 명령을 연결할 수 있나요?

제가 실행 중인 서버에 무언가를 설정하려고 하는데 폴더 cd에 들어갈 때 public_html95%의 시간 동안 항상 무언가를 확인하기 위해 명령을 실행합니다.

어쨌든 디렉토리가 자동으로 명령을 실행 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, pushd, popd...을 통해) 호출되는 함수입니다.

답변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변경 사항을 직접 감지 하므로 이 솔루션은 cd, pushd및 에서 작동합니다 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
}

관련 정보