当“cd”进入特定目录时自动获取文件

当“cd”进入特定目录时自动获取文件

我有几个实用程序命令和别名,它们在任何目录中都足够通用,可以满足我自己的要求。但有某些目录,例如“build”,我需要自定义行为。

为此,我在这些目录中创建了一个不同的文件,其中包含具有相同名称的函数和别名的修改(这样我就不需要记住新名称)。

目前,我在 cd'ing 到特定目录后手动获取文件

source custom_aliases_n_fns

这运作良好,但我希望自动执行此文件来源。

有没有办法将 cd'ing 上的文件源到特定目录?

注意:我采用了这种方法,因为我不想更改系统范围的用户别名。

答案1

在 中zsh,您可以使用chpwd特殊的钩子函数,只要当前工作目录发生更改,就会调用该函数:

custom_aliases_n_fns_already_sourced=false
chpwd() {
  if
    ! $custom_aliases_n_fns_already_sourced &&
      [[ $PWD = /some/dir && -f custom_aliases_n_fns ]]
  then
    source ./custom_aliases_n_fns
    custom_aliases_n_fns_already_sourced=true
  fi
}

我不建议盲目地采购文件任何目录(因此要检查$PWD = /some/dir),因为这可能会被滥用。

除了更改唯一的chpwd钩子之外,您还可以执行以下操作:

myhook() {
  if
    [[ $PWD = /some/dir && -f custom_aliases_n_fns ]]
  then
    source ./custom_aliases_n_fns
    chpwd_functions[(Ie)$0]=() # remove ourselves from the array
  fi
}
chpwd_functions+=(myhook)

这允许在当前工作目录更改时调用多个钩子函数,这里我们不记录我们是否已经获取该文件,而是chpwd在获取文件后从挂钩列表中删除我们的函数。

答案2

未经测试

目标目录中有.myaliases包含alias foo=bar命令的文件,没有空行,没有#comments。

在你的~/.bashrc

function cd() {
if [[ -f ./.myaliases ]] ; then
  sed -e 's/^/un/;s/=.*$//' ./.myaliases >/tmp/myaliases.$$
  source /tmp/myaliases.$$
  rm /tmp/myaliases.$$
fi

builtin cd "$*"

if [[ .f ./.myaliases ]]; then
 source ./.myaliases
fi

这将首先检查当前目录中是否有.myaliases文件,如果有,它将取消该文件中的任何别名,以便您可以干净地移动到新目录。然后,在移动到目标目录后,它会检查.myaliases那里是否有文件,如果找到,则获取该文件。阅读man bash更多详情。

答案3

也许类似这个模板?
来自.bashrc:

PS1+='$([ \w = ~ ] && command || another command)'

环境变量$PWD和转义提示\w序列都有效。这与您正在寻找的内容非常一致,但我不确定一般的正确方法。

相关内容