如何使用函数覆盖后获取原始系统命令?

如何使用函数覆盖后获取原始系统命令?

我现在正在参加一个 Hackathon,所以如果有人能尽快回答这个问题,那对我来说就太大了。

我在 .bashrc 中编写了一个名为 ls() 的函数,如下所示:

ls() {

  if(some condition);
    do something
  else
    ls; #(CALL TO ORIGINAL ls SYSTEM CALL)
  fi

}

但在这里,当它进入 else 部分时,它就会进入无限循环

我怎样才能在其他文件夹中调用原始 ls 系统调用?或者,如何才能使 ls 在一个文件夹中的行为不同,而在其他文件夹中的行为正常。

答案1

您正在寻找command

命令 [-pVv] 命令 [参数 ...]

运行命令时带上参数,抑制正常的 shell 函数查找。仅执行内置命令或在 PATH 中找到的命令。如果给出了 -p 选项,则使用 PATH 的默认值搜索命令,该默认值保证可以找到所有标准实用程序。如果给出了 -V 或 -v 选项,则会打印命令的描述。-v 选项导致显示一个单词,表示用于调用命令的命令或文件名;-V 选项产生更详细的描述。如果给出了 -V 或 -v 选项,如果找到命令则退出状态为 0,否则为 1。如果没有提供任何选项并且发生错误或找不到命令,则退出状态为 127。否则,内置命令的退出状态是命令的退出状态。

例子:

$ pwd() {
> echo 'command test'
> command pwd
> }
$ pwd
command test
/etc

还有builtin,其限制性更强:

内置 shell-builtin [参数]

执行指定的 shell 内置命令,向其传递参数,并返回其退出状态。这在定义名称与 shell 内置命令相同的函数时很有用,在函数中保留内置命令的功能。cd 内置命令通常以这种方式重新定义。如果 shell-builtin 不是 shell 内置命令,则返回状态为 false。

答案2

您可能还对 感兴趣which,它为您提供了具有该名称的程序的路径$PATH

$ which ping
/bin/ping

(尽管我推荐 Nykakin 的答案,因为它解决了你的问题。这只是任何感兴趣的人的另一个工具)

相关内容