【发布时间】:2023-04-09 22:26:01
【问题描述】:
前几天我在试验 shell 函数,目的是覆盖 ls 命令。
目的是让外壳程序首先调用我的ls 函数,然后如果第一个开关是“-y”做一件事,否则调用常规的/bin/ls,但结果的行为方式我不明白。
为了启用它,我决定使用“-y”作为开关,因为:
$ ls -y
ls: invalid option -- 'y'
Try `ls --help' for more information.
所以它不能破坏ls 的核心功能。
无论如何,将问题简化为最简单的问题,并使用其他几个示例来帮助突出问题:
$ function ls() { [[ "y$1" == "y-y" ]] && echo LS ; }
$ function less() { [[ "y$1" == "y-y" ]] && echo LESS ; }
$ function try() { [[ "y$1" == "y-y" ]] && echo TRY ; }
所以我将覆盖ls、less 并定义try,这就像“控制”样本:)
现在以这种方式调用:
$ ls ; less ; try
它的行为符合预期(没有输出),但是:
$ ls -y ; less -y ; try -y
LESS
TRY
ls 无法工作,但 less 覆盖可以,“控制”也是如此。
在 stackoverflow 或 askubuntu 的其他地方(但我暂时失去了参考)我看到了一个暗示 ls 是一个内置的示例,但是:
$ which ls
/bin/ls
和:
$ builtin ls
bash: builtin: ls: not a shell builtin
所以它似乎不在我的系统上(即使它是我实际上也看不出它为什么会这样)。
我想知道解释是什么?这并不重要,但我想了解发生了什么。
谢谢。
【问题讨论】:
-
阅读答案后,我决定添加此评论:“Doh!”
-
您的意思是您没有立即回忆起您键入的命令不是执行命令的六种方式?新手! ;)
-
“当你这样称呼我时微笑。”:)
-
我认为发生的事情是我专注于“内置”事物而排除任何其他解释,即使它实际上无法解释任何事情。 “当问题不在你所寻找的地方时,它就在其他地方!”重复 100 次。