我可以连接到 cd 命令吗?

TMH*_*TMH 11 shell bash cd-command

我正在尝试在我运行的服务器上设置一些东西,每当我cd进入public_html文件夹时,95% 的时间我都会运行一些命令来检查某些事情。

无论如何我可以挂钩,cd所以如果目录是 a public_html,它会自动为我运行命令吗?

如果我无法进入cd命令,我还能做其他事情来实现我所追求的结果吗?

我正在运行 CentOS 5.8。

Sté*_*las 17

kshbash(或zsh):

cd() {
  builtin cd "$@" || return
  [ "$OLDPWD" = "$PWD" ] || case $PWD in
      (*/public_html) echo do something
    esac
}
Run Code Online (Sandbox Code Playgroud)

zsh

chpwd()
  case $PWD in
    (*/public_html) echo do something
  esac
Run Code Online (Sandbox Code Playgroud)

(chpwd是一个钩子函数,每当当前工作目录发生变化时就会调用它(通过cd, pushd, popd...))。


UVV*_*UVV 15

您可以将此功能添加到您的.bashrc或其他启动文件(取决于您的外壳)。

cd() {      
   if [ "$1" = "public_html" ]; then
      echo "current dir is my dir"
   fi
   builtin cd "$1"
}
Run Code Online (Sandbox Code Playgroud)


Sim*_*mba 7

cd不建议使用现有命令Wrapping 。

更通用的解决方案是chpwd在 Bash 中定义自定义钩子。(根据这个问题的标签,我假设你正在使用 Bash)

与其他现代 shell 相比,Bash 没有设计完整的钩子系统。PROMPT_COMMAND变量用作钩子函数,相当于precmdZSH中的hook,fish_prompt在Fish中。目前,ZSH 是我所知道的唯一一个chpwd内置钩子的 shell。

PROMPT_COMMAND

如果设置,该值将被解释为在打印每个主要提示 ($PS1) 之前执行的命令。

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Bash-Variables

chpwd 在 Bash 中挂钩

提供了一个技巧来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}"
Run Code Online (Sandbox Code Playgroud)

由于我们检测PWD直接更改,该解决方案可与cdpushdpopd

注意:我们chpwd在 Bash 和chpwdZSH 中的实现之间的主要区别是,PROMPT_COMMAND在非交互式 Bash shell 中不受支持。

用法

_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"
Run Code Online (Sandbox Code Playgroud)

来源:根据我的要点在 Bash 中创建 chpwd 等效钩子

对于任何想要 ZSH 答案的人。chpwd在 ZSH 中使用钩子。不要chpwd()直接定义函数。 更多细节在这里