Bash 不使用';好像不行

Bash 不使用';好像不行,bash,ls,Bash,Ls,前几天我在试验shell函数,目的是覆盖ls命令。 其目的是让shell先调用myls函数,然后如果第一个开关是“-y”,则执行一件事,否则调用常规的/bin/ls,但结果的行为方式我不理解 为了启用它,我决定使用“-y”作为开关,因为: $ ls -y ls: invalid option -- 'y' Try `ls --help' for more information. 因此,它不能破坏ls的核心功能。 总之,将问题简化为最简单的问题,并通过几个其他示例来帮助突出问题: $ func

前几天我在试验shell函数,目的是覆盖
ls
命令。 其目的是让shell先调用my
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
无法工作,但是
less
覆盖和“控件”一样工作

在stackoverflow或askubuntu的其他地方(但我暂时失去了参考资料),我看到了一个示例,其中暗示
ls
是一个内置的,但是:

$ which ls
/bin/ls
以及:

所以它似乎不在我的系统中(即使它是,我也不明白它为什么会这样)

我不知道这是什么解释?这并不重要,但我想知道发生了什么


谢谢。

ls
设置别名是很常见的,您可能需要这样做。别名首先被处理,这是文本的简单替换。在您的示例中发生的是:

A) `ls` is replaced with `ls --color=auto` 
B) Your `ls` function is called with the replaced text and your -y option 
C) Your function checks "$1", which is --color=auto
下面显示了此行为的示例:

$ function ls() { [[ "y$1" == "y-y" ]] && echo LS ; }
$ ls -y
$ type ls
ls is aliased to `ls --color=auto'
$ unalias ls
$ type ls
ls is a function
ls ()
{
    [[ "y$1" == "y-y" ]] && echo LS
}
$ function ls() { [[ "y$1" == "y-y" ]] && echo LS ; }
$ ls -y
LS
$ alias ls="ls --color=auto"
$ ls -y
--color=auto -y
我猜

$ alias ls

将向您显示原因。

不要使用
哪个
,请使用
类型
。如果你有

$ type ls
ls is aliased to `ls --color=auto'
那么,在交互式shell中,您的函数将失败。在
.bashrc
或其定义的任何位置删除此项。您还可以使用内置的
unalias

如果在函数中运行与函数同名的命令,还需要避免递归

ls()
    if [[ $1 == -y ]]; then
        shift
        ...
    else
        command ls "$@"
    fi

另外,如果您决定使用
function
关键字定义函数,请确保您知道自己在做什么。在撰写本文时需要POSIX兼容性时,请使用POSIX style
funcname()复合命令。

@msw
type
很好。我想说,当目标是Bash时,它是首选的。不幸的是,POSIX几乎没有说明它实际上应该做什么,因此选项和确切输出有很大的不同。谢谢Ormaj。(我的“真实”版本对递归进行了检查:这只是对最简单情况的简化)。在阅读了答案后,我决定添加以下注释:“Doh!”你的意思是你没有立即回忆起你键入的命令不是执行的命令的六种方式?新手!;)“当你这么叫我时,请微笑。”:)我想发生的事情是我专注于“内置”的东西,而忽略了任何其他解释,即使它实际上无法解释任何事情。“当问题不在你看的地方时,它在其他地方!”重复100次。
$ type ls
ls is aliased to `ls --color=auto'
ls()
    if [[ $1 == -y ]]; then
        shift
        ...
    else
        command ls "$@"
    fi