为什么 Bash 会在函数中使用的 `ls` 命令中自动插入 `--color=auto`

xen*_*oid 0 bash alias bash-functions

我有这个setup文件:

function latest { 
    count=${1:-5} ; 
    echo "Just changed"
    ls -lrtd * | tail -$count ; 
}
Run Code Online (Sandbox Code Playgroud)

我称之为:

. setup
Run Code Online (Sandbox Code Playgroud)

然后我问 bash 是否latest定义了函数:

>type latest
latest is a function
latest () 
{ 
    count=${1:-5};
    echo "Just changed";
    ls --color=auto -lrtd * | tail -$count
}
Run Code Online (Sandbox Code Playgroud)

Just changed是一个任意字符串,我用来确保我没有查看latest来自另一个文件的定义。

问题是:为什么 Bash 将添加--color=autols命令中(因为输出是通过管道传输的,所以它没有用)。是的,在我的外壳ls上别名为ls --color=auto,如果我删除别名,这不会发生。但是我认为在函数中没有使用别名,无论如何这种替换发生在函数定义时?

Jef*_*ler 6

您已经观察到记录在案的行为;在bash 手册别名部分

别名在读取函数定义时展开,而不是在执行函数时展开,因为函数定义本身就是一个命令。