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


10

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

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

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

제약 사항 :

  • 대화식 및 비 대화식 셸에서 모두 작동해야한다고 생각합니다. $PROMPT_COMMAND
  • cd디렉토리를 변경하는 명령 (예 : pushd및 popd) 에서 작동하기를 원하기 때문에 재정의 할 수 없습니다.
  • 그것은 실행해야합니다 후 그래서, 사용자의 명령 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.