回答:
この関数を.bashrc
(シェルに応じて)またはその他の起動ファイルに追加できます。
cd() {
if [ "$1" = "public_html" ]; then
echo "current dir is my dir"
fi
builtin cd "$1"
}
. ~/.bash_profile
/bin/cd
私のCentOSにはないようなので、このソリューションは機能しない可能性があります
cd -P public_html
かcd ~/public_html
またはあなたができない場合は、予期しない動作を持っているcd
にpublic_html
。
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
...))。
cd
既存のコマンドであるをラップすることはお勧めしません。
より一般的なソリューションはchpwd
、Bashでカスタムフックを定義することです。(この質問のタグによると、私はあなたがBashを使用していると思います)
他の最新のシェルと比較すると、Bashで設計された完全なフックシステムはありません。PROMPT_COMMAND
変数は、Fishの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に相当するフックを作成します。
誰にとってもZSHの答えを求めています。chpwd
ZSHでフックを使用します。関数を直接定義しないでくださいchpwd()
。 詳細はこちら。
私はbashのエキスパートではありませんが、@ UVVの回答を少し修正して、次のようにします。
public_html
、私はいくつかをチェックしたいhook-script
ターゲット・ディレクトリ内のファイル$1
、、と言いますcd_hook.sh
。hook-script
存在する場合は、それを実行し、次に進みますcd
このcd
ディレクトリを追加するだけで、必要に応じて-hookを任意のディレクトリに適用できるため、これはより一般的なようですcd_hook.sh
。
cd
どこかにいる場合は、.bashcd
ファイルを確認して、存在する場合は実行します。
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
}
echo "Testing..."
、ifのすぐ上に追加しましたが、出力はありません。これらの変更を適用するために何かする必要がありますか?