我现在正在参加一个 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 的答案,因为它解决了你的问题。这只是任何感兴趣的人的另一个工具)