$ PWD를 변경 한 후 bash에서 명령을 어떻게 실행할 수 있습니까?


10

zsh는 사용자가 디렉토리를 변경 한 후 함수를 실행하는 것을 포함하여 멋진 후크 함수를 제공합니다 chpwd.

# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd  # hi

나는 bash에서 그것을 모방하려고합니다.

제약 사항 :

  • 대화식 및 비 대화식 셸에서 모두 작동해야한다고 생각합니다. $PROMPT_COMMAND
  • cd디렉토리를 변경하는 명령 (예 : pushdpopd) 에서 작동하기를 원하기 때문에 재정의 할 수 없습니다.
  • 그것은 실행해야합니다 그래서, 사용자의 명령 trap "my_function" DEBUG, 어떻게 든 거기에 말할 수없는 한,하지 작업 수행 "먼저 실행 $BASH_COMMAND한 후이 작업을 수행 갇혀 우리를 ..."내가 자동 실행을 방지 할 수 있습니다 볼의 $BASH_COMMAND 경우 extdebug 사용 가능 트랩 함수가 반환 1,하지만 난 강요 할 생각하지 않는다 extdebug, 그리고 반환 1성공 (그러나 수정) 명령하는 것은 잘못된 것 같다.

마지막 부분 인 "사용자 명령 후 실행"은 현재 저를 엉망으로 만들었습니다. 각 명령 후에 함수 실행할 있으면 마지막 확인 이후 디렉토리가 변경되었는지 확인할 수 있습니다. 예 :

function check_pwd() {
  # true in a new shell (empty var) or after cd
  if [ "$LAST_CHECKED_DIR" != "$PWD" ]; then
    my_function
  fi
  LAST_CHECKED_DIR=$PWD
}

내가 올바른 길을 가고 있습니까, 아니면 더 좋은 방법이 있습니까? 사용자가 디렉토리를 변경 한 후 bash에서 명령을 어떻게 실행할 수 있습니까?


3
왜 다시 정의하지 cd, pushd그리고 popd? 디렉토리를 변경하는 방법은 몇 가지가 있습니까?
jw013

@ jw013이 코드는 관리자가 cd원칙적으로 재정의하지 않은 것으로 명시한 오픈 소스 프로젝트에 사용됩니다 .
Nathan Long

또한- "디렉토리를 변경하는 데 다른 방법이 얼마나 있습니까?"-잘 모르겠습니다. 명시 적으로 나열하지 않는 다른 이유입니다.
Nathan Long

왜 이러고 싶니? 함수가 많은 프로그램을 제동 할 수 있습니다 (C, Java, ..). 사용하는 스크립트 MYBIN=$( cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P )에서 신뢰할 수있는 Unix 명령을 변경하지 마십시오.
Walter A

1
@NathanLong 그건 내 운영 체제에만 해당됩니다 . 여기서는 운영 체제와 관련이없는 것 같습니다. OS가 중요합니까? 그것은 귀하의 질문에 중요한 쉘이며, 당신은 구체적으로 묻는 것처럼 보입니다 bash. 이것은 실행중인 모든 운영 체제에서 거의 동일하게 작동합니다.
jw013

답변:


2

이러한 제약 조건을 충족시키는 방법은 없습니다

내 제약 조건으로 bash 에서이 문제를 해결할 수있는 방법이없는 것 같습니다. 일반적으로 가능한 해결책은 다음과 같습니다.

  • 재정 cd, pushd그리고 popd, 그래서 디렉토리를 변경하는 모든 명령 먼저 후크 함수를 실행하는 것입니다. 그러나 이것은 1) 재정의가 원래 명령처럼 완료하고 동일한 종료 코드를 반환하도록주의해야하며 2) 둘 이상의 도구 가이 접근법을 취하면 함께 재생할 수 없기 때문에 문제가 발생할 수 있습니다
  • 환경 변경으로 실행될 수있는 모든 명령을 대체하여 후크 기능을 먼저 실행하십시오. 이러한 명령이 많으므로 어렵습니다.
  • trap 'my_functionDEBUG so that every command will run the hook function. This is suboptimal because 1) it runs before every command, 2) it runs *before*cd`, 3) 이후에는 디버그 기능이 하나만있을 수 있으므로 다른 도구가이 방법을 사용하면 서로 잘 작동하지 않습니다.
  • $PROMPT_COMMAND후크 기능을 먼저 실행하도록 재정의 하십시오. 비 대화식 쉘에서는 작동하지 않으므로 다른 도구가 프롬프트 명령을 정의하면 서로 잘 작동하지 않기 때문에 차선책입니다.

간단히 말해서 bash가 zshell의 chpwd_functions후크 와 같은 것을 제공하면 유일한 훌륭한 해결책 인 것처럼 보이지만 올바르게 시뮬레이션하는 것은 불가능한 것 같습니다.


1

관리자가 cd에 대한 정의를 변경하는 것을 좋아하지 않는다면, 다른 옵션은이 디렉토리 내 환경을 사용하는 모든 명령을 재정의하는 것입니다.

for c in cmd1 cmd2 cmd3 cmd4 cmd5 ; do
    eval "$c() { check_pwd ; command $c \"\$@\" ; }"
done

PWD 후크 및 디렉토리 내 구성은 필요할 때만 처리되므로 매우 효율적입니다.

check_pwd 함수 예제에서 다음을 변경할 수 있습니다.

my_function

에:

my_function "$PWD"

새로운 cwd를 전달하기 위해 (더 모듈화되고 테스트 가능할 수 있음).


"이 디렉토리 내 환경을 사용하는 모든 명령을 재정의하십시오"불행히도, 나는 그것을 예측할 수 없습니다.
Nathan Long

0

배포판에 따라 inotify-tools를 설치 하십시오.

inotifywait -emodify,create,delete -m /path/to/directory | while read line; do service httpd reload; done

내 예제 httpd에서 지정된 디렉토리에서 변경 (Modify, Create, Delete)이 있으면 다음 명령이 다시 시작 됩니다.

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