如何在仍在使用时增强内置的shell函数

问题描述 投票:0回答:1

大多数时候,id不仅希望看到特定命令在哪里,还希望看到它是什么。示例which lsd告诉我该命令有效并且存在于/usr/local/bin/lsd中,但更有趣的信息是:它指向../Cellar/lsd/0.16.0/bin/lsd的链接,告诉我它是由自制程序管理的命令。

所以要看到两者,我想创建一个别名。但是别名似乎不能与参数一起使用,甚至对于可能有效的简单命令也不适用,我没有使它与内联命令执行一起使用,例如$(which $1)。接下来,我创建了一个shell函数来正确使用命令参数:

function dings() {
  command=`which $1`
  echo $command
  eval "$command --version" # might not be supported by all commands
  ll $command
}

此函数有点像我想要的那样:

enter image description here

除了一件事:我必须记住函数名并使用它代替which。因此,我尝试使用该函数的别名,但是他产生了奇怪的东西,因为这导致递归调用自身-那就太糟糕了。由于这不是命令,因此我也无法使用其确切位置来忽略此“错误”。

所以问题是:如何用我自己的仍使用默认值which的函数替换内部shell函数which

另外,我将如何显示所找到的该命令的所有实例?因此,在我的系统中,有两个版本的lsd。首先是较旧的Brew版本,其次是cargo版本。

bash function shell alias
1个回答
0
投票

您的问题“我如何选择要使用的which的直接解决方案是抑制外壳函数查找的内置command

which() {
    command which "$1"
    "$1" --version
    ll "$(command which "$1")"
}

这还避免了不必要的eval,并且不使用临时变量。如果要避免两次运行which,则可以使用temp变量,但不要将其泄漏到环境中:

which() {
    local whichpath
    whichpath=$(command which "$1")
    printf '%s\n' "$whichpath"
    "$1" --version
    ll "$whichpath"
}

但是您可以避免完全使用外部命令which,而使用内置的type

type() {
    local typepath
    typepath=$(command type -p "$1")
    printf '%s\n' "$typepath"
    "$1" --version
    ll "$typepath"
}

注意,如果您使用它来查找不是可执行文件的文件,则会中断操作。

或者,如果您真的想混淆未来的自我,可以调用函数which,但可以在后台使用type

which() {
    local typepath
    typepath=$(type -p "$1")
    printf '%s\n' "$typepath"
    "$1" --version
    ll "$typepath"
}
© www.soinside.com 2019 - 2024. All rights reserved.