私は実行中のサーバーに何かを設定しようとしていますが、フォルダ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
}