我可以连接 cd 命令吗?

我可以连接 cd 命令吗?

我试图在我运行的服务器上设置一些东西,当我cd进入一个public_html文件夹时,95%的时间我总是会运行一些命令来检查某些东西。

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

如果我无法连接到该cd命令,我还可以做其他事情来实现我想要的结果吗?

我运行的是 CentOS 5.8。

答案1

kshbash(或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或其他启动文件中(取决于您的 shell)。

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

答案3

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

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

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

提示命令

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

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

chpwdBash 中的钩子

提供了一个技巧,可以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直接检测变化,因此该解决方案适用于cdpushdpopd

笔记chpwd:我们在 Bash 中的实现与ZSH 中的实现之间的主要区别chpwd是,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"

来源:在 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
}

相关内容