我有几个实用程序命令和别名,它们在任何目录中都足够通用,可以满足我自己的要求。但有某些目录,例如“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
序列都有效。这与您正在寻找的内容非常一致,但我不确定一般的正确方法。