cd 명령에 연결할 수 있습니까?


9

지금 나는 때 나는, 서버 I 실행에 설정 무언가 최대로 노력하고있어 cdpublic_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"
}

오, 이거 흥미로워 나는 이것을 .bash_profile에 추가 echo "Testing..."하고 if 바로 위에 추가 했지만 출력은 없습니다. 이러한 변경 사항을 적용하려면 무엇을해야합니까?
TMH

@TomHart 새 세션을 시작하지 않은 경우 다음 방법으로 파일을 현재 세션으로 소싱해야합니다.. ~/.bash_profile
UVV

@TomHart /bin/cdCentOS 에는없는 것 같습니다. 이 솔루션은 작동하지 않을 수 있습니다.
UVV

방금 그 사실을 알았습니다. 왜 unix.stackexchange.com/questions/116955/where-is-cd-located 라는이 질문을 발견했습니다 . 실제로 / bin / cd가있는 시스템에는 여전히 좋은 솔루션입니다 :).
TMH

1
당신이 경우 작동하지 않습니다 cd -P public_htmlcd ~/public_html또는 당신이 할 수하지 않을 경우 예기치 않은 동작이 cd로를 public_html.
Stéphane Chazelas

17

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...)).


3

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(). 자세한 내용은 여기를 참조하십시오 .


1

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

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

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


3
일반적인 것처럼 보이지만 보안 취약점이 있습니다. 예를 들어 다음에 CD를 넣을 때 코드를 실행하려면 누군가 또는 무언가가 / tmp에 후크 스크립트를 심기 만하면됩니다. 당신은 그것에서의 디렉토리 당신들만 쓸 것을, 후크 스크립트가 당신 아닌 다른 사람에 쓰기 가능 권한이 없습니다, 귀하가 아닌 심볼릭 링크를 소유하고 있는지 확인 적어도 싶어 ... 참조 작업 디렉토리 당 역사를 유지 보다 안전한 접근을 위해서는 ( 쉘 세션 당 참조)
Stéphane Chazelas

보안 정보 @ StéphaneChazelas에 감사드립니다. 나는 그것에 대해 생각조차하지 않았다는 것을 인정해야합니다.
분실물 발견

cd어딘가에 있으면 .bashcd파일을 확인하고 파일이 있으면 실행하십시오.
DarkWiiPlayer

0

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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.