쉘에 후크형 시스템이 있습니까?

쉘에 후크형 시스템이 있습니까?

나는 특정한 일을 특정한 순서로 하는 것을 좋아한다는 것을 깨달았습니다.

내 생각에 후크는 기본적으로 "이벤트 이후에 무언가를 수행하는 것"입니다. 여기서 이벤트는 , 또는 기타 git clone명령 과 같은 매개변수가 있는 명령일 수 있습니다.git submodule addcdrm

git add나는 "만약 , 한다면 " 이라고 말하고 싶습니다 git status. 예를 들어, 나는 항상 git add X; git status, 및 를 가지고 cd X; ls -la있으며 내 작업 흐름에서 자동화하고 싶은 유사한 조합을 더 많이 생각할 수 있습니다.

alias\function을 사용할 수 없는 세 가지 이유가 있습니다.용이하게여기서 일하세요:

  1. 이것불가능하다고 생각하는 가장 큰 이유용이하게수행된 작업은 여러 함수 정의가 있고 기존 함수를 계속 사용하면서 재정의하는 방법을 찾지 못했다는 것입니다.

내가 의미하는 바를 설명하기 위해 예를 사용하겠습니다. 저는 Nathan Broadbent가 작성한 일부 zsh 스크립트를 사용하고 있습니다.마이크로컨트롤러 브리즈- 스크립트는 작업을 수행하는 git() 함수를 추가합니다.

이제 워크플로를 자동화하고 이전 명령으로 생성된 각 워크플로 뒤에 디렉터리를 git clone갖도록 만들고 싶다고 가정해 보겠습니다.cd수행 방법은 다음과 같습니다.). 이를 위해 git() 함수를 사용하겠습니다. 그렇죠?

이 기능은 SCM Breeze 명령보다 우선 적용되며 SCM Breeze를 사용할 수 없습니다.

  1. 별칭은 나에게 뭔가를 기억하라고 요구합니다. 나는 이것이 자동으로 일어나기를 원합니다.
  2. 유지 관리가 쉽지 않음- 모든 명령을 수동으로 재정의하려고 시도했지만 내용을 변경하는 것이 정말 번거롭고 복잡성으로 인해 생각할 수 있는 모든 조합에 대해 수행하는 것을 볼 수 없습니다.

도움이 된다면 OhMyZsh와 함께 ZSH를 사용하고 있습니다.

지금은 이 작업을 수행하기 위해 bash 스크립트(별명 및 함수)를 사용하고 있지만 지금 내가 하고 있는 작업은 다른 사람이 수행할 가능성이 가장 높은 것 같습니다. 이 작업을 수행하는 프로젝트에 대해 잘 아는 사람이 있나요? "훅"을 깔끔한 방법으로 홍보하는 데 도움을 주실 수 있나요?

답변1

당신에게 도움이 될 수 있는 것들:

후크 preexec함수는 각 명령줄이 실행되기 전에 호출됩니다(각 명령 이전이 아님).

preexec() echo will execute: $1

precmd각 프롬프트 앞에.

precmd() echo executed: $history[$[HISTCMD-1]]

다음과 같이 기능을 확장할 수 있습니다.

functions[git]='
  (){ '$functions[git]'; } "$@"; local myret=$?
  do-extra-stuff
  return $myret'

또는:

functions[git-old]=$functions[git]
git() {
  git-old "$@"
  local myret=$?
  do-extra-stuff || return $myret
}

DEBUG트랩은 모든 명령 후에 실행됩니다.

trap 'echo $ZSH_DEBUG_CMD returned with $?' DEBUG

위젯을 재정의하여 accept-line( 매핑 Enter) 위젯 내에서 작업을 수행할 수 있습니다.

accept-line() {
  zle -R "going to run: $BUFFER"
  sleep 1
  zle .$WIDGET
}

zle -N accept-line

답변2

내가 아는 한, 귀하가 설명하는 것과 유사하게 작동하는 시설은 없습니다. 그러나 원하는 것을 달성하기 위해 Bash에서 별칭이나 함수를 만드는 것이 가능합니다. 이는 설명하는 것과 유사하게 들립니다.

함수로

$ function mygadd() { git add "$@"; }
$ function mcd() { cd "@"; ls -la; }

별칭으로

$ alias mycmd='cmd1; cmd2;'

노트:별칭을 사용하면 위치 매개변수를 전달할 수 없습니다. 별칭 호출에 인수를 포함시켜 인수를 의사 전달한 다음 셸에서 단일 명령줄로 확장할 수 있습니다.

$ alias somecmd='ls -la'
$ somecmd dir1 dir2 

위의 코드가 호출되지만 ls -la dir1 dir2이 두 매개변수는 별칭에 전달되지 않으며 대신 ls -la dir1 dir2명령줄이 평가되고 실행될 때 별칭이 확장됩니다.

둘 다 구성 파일에 병합되어 $HOME/.bashrc로그인할 때마다 로드될 수 있습니다.

관련 정보