我想通过不带参数地~/.zshrc
运行来获取我的资源.
。所以这:
$ .
应该这样做:
$ . ~/.zshrc
我希望 的正常功能.
保持不变。唯一的区别应该是何时.
不带参数调用。
这可能吗?
我尝试了几种不同的方法。这是其中之一:
dot_zshrc_or_args() {
if [[ $# == 0 ]]; then
\. ~/.zshrc
else
filename=$1
shift
\. $filename $@
fi
}
alias .=dot_zshrc_or_args
这是一个示例,说明了它不起作用的原因:
$ echo 'echo $#' > count_args.sh
$ delegate() { . ./count_args.sh }
$ delegate foo bar baz
最后一个命令应该 echo 3
,但如果已经定义了0
上面的别名,它就会回显。.
根本问题似乎是.
shell 对其进行了特殊处理,允许它调用的脚本可以访问所有局部变量,包括$1
、$2
等。因此,如果我尝试包装.
另一个函数,我将失去该行为(如上面的示例所示)。
我想到的两种方法是:
- 使用别名而不是函数
- 使其
.
仅在交互式 shell 中使用别名,而不是从另一个函数运行时使用别名。
但无论我如何尝试,我都无法让它发挥作用。是否可以? (如果没有,我可以使用的最接近的替代方案是什么?我的最终目标是能够~/.zshrc
从 shell 中快速获取我的资源,最好以直观且易于记忆的方式。)
答案1
这可以通过做一些可怕的事情来完成accept-line
:
function _accept-line() {
if [[ $BUFFER == "." ]]; then
BUFFER="source ~/.zshrc"
fi
zle .accept-line
}
zle -N accept-line _accept-line
答案2
编写一个function
for.
来.
根据需要调用内置函数。另外,==
对于 shell 数字比较来说是不正确的(test
很奇怪,并且需要-eq
or -ne
)。
function . {
if [[ $# -eq 0 ]]; then
builtin . ~/.zshrc
else
builtin . "$@"
fi
}