지금 나는 때 나는, 서버 I 실행에 설정 무언가 최대로 노력하고있어 cd
에 public_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"
}
답변
와 ksh
나 bash
(또는 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
( chpwd
A는 후크 현재 작업 디렉토리의 방법으로 (변경 될 때마다 호출 기능 cd
, pushd
, popd
…)).
답변
cd
기존 명령 인 래핑 은 권장되지 않습니다.
보다 보편적 인 솔루션은 chpwd
Bash에서 사용자 정의 후크를 정의하는 것 입니다. (이 질문의 태그에 따르면 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
, pushd
및 popd
.
참고 : chpwd
Bash 구현과 chpwd
ZSH 구현 의 주요 차이점은 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에 대한 답변을 원합니다. chpwd
ZSH에서 후크를 사용하십시오 . 함수를 직접 정의하지 마십시오 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
}