私が実行しているサーバーに何かを設定しようとしています。いつでも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
はhook関数であり、現在の作業ディレクトリが変更されるたびに呼び出されます(cd
、pushd
、popd
...))。
既存のコマンドであるcd
をラップすることはお勧めしません。
より一般的なソリューションは、Bashでカスタムchpwd
フックを定義することです。 (この質問のタグによると、あなたはBashを使用していると思います)
他の最新のシェルと比較すると、Bashで設計された完全なフックシステムはありません。 Prompt_COMMAND
変数はフック関数として使用されます。これは、ZSHではprecmd
フック、Fishではfish_Prompt
と同等です。とりあえず、chpwd
フックが組み込まれているシェルはZSHだけです。
Prompt_COMMAND
設定されている場合、値は各プライマリプロンプト($ PS1)の印刷前に実行するコマンドとして解釈されます。
https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-Variables
chpwd
バッシュのフックPrompt_COMMAND
に基づいてBashにchpwd
同等のフックを設定するためのトリックが提供されています。
# 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
で機能します。
注:Bashのchpwd
実装とZSHのchpwd
の主な違いは、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に相当するフックを作成 私の要旨から。
誰にとってもZSHの答えを求めています。 ZSHでchpwd
フックを使用します。 chpwd()
関数を直接定義しないでください。詳細はこちら 。
私はbashのエキスパートではありませんが、@ UVVの回答を少し修正して、次のようにします。
public_html
をチェックする代わりに、ターゲットディレクトリhook-script
、たとえば$1
のcd_hook.sh
ファイルをチェックするだけです。hook-script
が存在する場合は、それを実行し、cd
に進みます。これにより、cd_hook.sh
をディレクトリに追加するだけで、cd
- hookを任意のディレクトリに適用できるようになるため、より一般的なようです。
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
}