cd 명령에 연결할 수 있습니까? 나는 때 나는, 서버 I 실행에

지금 나는 때 나는, 서버 I 실행에 설정 무언가 최대로 노력하고있어 cdpublic_html시간의 폴더에 95 % 난 항상 어떤 일을 확인하기 위해 실행하는 몇 가지 명령이 있습니다.

어쨌든 내가 연결할 수 있습니까? cd디렉토리가 인 경우 public_html자동으로 명령을 실행합니까?

cd명령에 연결할 수 없다면, 내가 추구하는 결과를 달성하기 위해 할 수있는 다른 일이 있습니까?

CentOS 5.8을 실행하고 있습니다.



답변

.bashrc쉘에 따라이 기능을 사용자 또는 다른 시작 파일에 추가 할 수 있습니다 .

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

답변

kshbash(또는 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

( chpwdA는 후크 현재 작업 디렉토리의 방법으로 (변경 될 때마다 호출 기능 cd, pushd, popd…)).


답변

cd기존 명령 인 래핑 은 권장되지 않습니다.

보다 보편적 인 솔루션은 chpwdBash에서 사용자 정의 후크를 정의하는 것 입니다. (이 질문의 태그에 따르면 Bash를 사용한다고 가정합니다)

다른 현대 쉘과 비교할 때 Bash에는 완벽한 후크 시스템이 없습니다. PROMPT_COMMAND변수는 후크 함수로 사용되며, 이는 물고기 precmd에서 ZSH의 후크 와 같습니다 fish_prompt. 당분간 ZSH는 chpwd후크가 내장 된 유일한 쉘 입니다.

PROMPT_COMMAND

설정된 경우 값은 각 기본 프롬프트 ($ PS1)를 인쇄하기 전에 실행할 명령으로 해석됩니다.

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

chpwd 배쉬에 훅

chpwd기반으로 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, pushdpopd.

참고 : chpwdBash 구현과 chpwdZSH 구현 의 주요 차이점은 PROMPT_COMMAND비대화 형 Bash 셸에서 지원되지 않는다는 것입니다.

용법

_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 Equivalent Hook을 만듭니다 .

누구나 ZSH에 대한 답변을 원합니다. chpwdZSH에서 후크를 사용하십시오 . 함수를 직접 정의하지 마십시오 chpwd(). 자세한 내용은 여기를 참조하십시오 .


답변

나는 bash 전문가는 아니지만 @UVV의 ​​답변을 취하여 조금만 수정 하여이 작업을 수행합니다.

  • 를 확인하는 대신 대상 디렉토리의 public_html일부 hook-script파일을 확인 $1하려고 cd_hook.sh합니다.
  • 그것이 hook-script존재한다면 그것을 실행하고cd

선택한 cd디렉토리에-을 추가하여 원하는 경우 -hook을 모든 디렉토리 에 적용 할 수 있기 때문에보다 일반적인 것으로 보입니다 cd_hook.sh.


답변

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
}