제가 실행 중인 서버에 무언가를 설정하려고 하는데 폴더 cd
에 들어갈 때 public_html
95%의 시간 동안 항상 무언가를 확인하기 위해 명령을 실행합니다.
어쨌든 디렉토리가 자동으로 명령을 실행 cd
하도록 연결할 수 있습니까 ?public_html
해당 명령에 연결할 수 없는 경우 cd
원하는 결과를 얻기 위해 할 수 있는 다른 방법이 있습니까?
저는 CentOS 5.8을 사용하고 있습니다.
답변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
는훅현재 작업 디렉터리가 변경될 때마다( cd
, pushd
, popd
...을 통해) 호출되는 함수입니다.
답변2
이 기능을 자신이나 다른 시작 파일에 추가할 수 있습니다 .bashrc
(셸에 따라 다름).
cd() {
if [ "$1" = "public_html" ]; then
echo "current dir is my dir"
fi
builtin cd "$1"
}
답변3
cd
기존 명령 Wrapping을 사용하는 것은 더 이상 사용되지 않습니다.
보다 일반적인 해결책은 chpwd
Bash에서 사용자 정의 후크를 정의하는 것입니다. (이 질문의 태그를 기반으로 Bash를 사용하고 있다고 가정합니다.)
다른 최신 쉘과 비교할 때 Bash는 완전한 후킹 시스템으로 설계되지 않았습니다. 변수는 후크 함수로 사용되며 ZSH 및 Fish의 후크 PROMPT_COMMAND
와 동일합니다 . 현재 ZSH는 내가 아는 내장 후크가 있는 유일한 셸입니다.precmd
fish_prompt
chpwd
프롬프트 명령
설정된 경우 이 값은 각 기본 프롬프트($PS1)를 인쇄하기 전에 실행되는 명령으로 해석됩니다.
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-Variables
chpwd
Bash의 후크
chpwd
.NET 기반 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와 ZSH 구현의 주요 차이점은 비대화형 Bash 셸에서는 지원되지 않는다는 chpwd
것입니다 .PROMPT_COMMAND
용법
_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와 동등한 Hook 생성내 요점에서.
ZSH에 대한 답변을 원하는 모든 사람을 위해. chpwd
ZSH에서 후크 사용.함수를 직접 정의 하지 마세요 chpwd()
. 자세한 내용은 여기.
답변4
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
}