gpt4 book ai didi

bash - 如何覆盖 pushd 和 popd 对 dirs 的自动调用?

转载 作者:行者123 更新时间:2023-11-29 09:25:27 25 4
gpt4 key购买 nike

我的 bash (4.1) 目录堆栈通常有十几个或更多条目。我想用 dirs -v 替换 dirs 的输出,所以我再也不用用 pushd 玩“猜魔数(Magic Number)”了。

我的部分解决方案

我将 dirs 替换为使用 command 执行 dirs -v 的函数:

dirs()
{
# "command" builtin prevents infinite recusion by suppressing lookup
# of function and alias names.
command dirs -v "${@}"
}

(更新:在 pneumatics' suggestion ,我现在使用 builtin 而不是 command。它没有解决这个问题,但它稍微安全一些。)

dirs 输出现在是可读的,但是 pushdpopd 仍然产生旧的 vomit-of-slashes :

$ pushd ~/just/one/more/and/ill/quit/i/promise
~/just/one/more/and/ill/quit/i/promise ~/tmp/bash/bash-4.1...
may/give/rise/to/dom /oh/no/not/again /var/adm/log /omg/wt...
va/lang ~/doc/comp/java/api/java/util/regex barf barf barf...

用别名替换我的 dirs 函数后,我得到了相同(缺少)的结果:

alias dirs='command dirs -v "${@}"'

解决方法

我最终通过覆盖 pushdpopd 得到了我想要的输出:

pushd()
{
command pushd "${@}" >/dev/null &&
dirs
}
# popd is similar.

这可行,但它需要重写三个 内置函数而不是一个。此外,在我没有想到的某些极端情况下,这可能是对 pushdpopd 的不完美模拟。我宁愿只覆盖 dirs

我的问题

为什么覆盖 dirs 不起作用? 根据 bashman 页面,pushdpopd:

If the pushd command is successful, a dirs is performed as well.

那么为什么 pushdpopd 似乎调用了内置的 dirs 而不是函数或别名?

关于 bash 文档的脚注

bashref.* online manual 中缺少“a dirs is performed as well”的段落, 但它们出现在 man 页面 bash.*builtins.* 中。我的 bash 4.1 文档和当前的 4.4 文档以相同的方式不一致,这表明 4.4(如果我有的话)会表现相同。

最佳答案

您想使用 builtin 而不是 command。我认为这就是您所追求的,覆盖 pushdpopd,同时保留 dirs 原样。

pushd(){ builtin pushd "$@" >/dev/null && dirs -v; }
popd() { builtin popd "$@" >/dev/null && dirs -v; }

关于bash - 如何覆盖 pushd 和 popd 对 dirs 的自动调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39715474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com