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

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

我有这个setup文件:

function latest { 
    count=${1:-5} ; 
    echo "Just changed"
    ls -lrtd * | tail -$count ; 
}

我称之为:

. setup

然后我询问 bash 该latest函数是否已定义:

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

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

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

答案1

您观察到有记录的行为;在里面bash 手册的别名部分:

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

答案2

杰夫上面是正确的。要查看 shell 中定义的别名,请在提示符下键入“alias”。

例子:

[USERID ~] $ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -ahlF'
alias ls='ls --color=auto'
alias vi='vim'
[USERID ~] $

为了避免脚本中出现别名,您需要取消“ls”命令的别名或直接调用它。要查找“ls”的位置,请使用内置的 shell 类型:

[USERID ~] $ type -P ls
/usr/bin/ls

您可以将其放入变量中并使用该变量调用“ls”:

[USERID ~] $ lsCmd=$(type -P ls)
[USERID ~] $ echo $lsCmd
/usr/bin/ls
[USERID ~] $ ls
MyAppData  MyDocuments  MyDownloads  Scripts  tmp.VOOlcGffwf  tmp.Y6IE7S2ps4
[USERID ~] $ $lsCmd
MyAppData  MyDocuments  MyDownloads  Scripts  tmp.VOOlcGffwf  tmp.Y6IE7S2ps4

在第一种情况下,仅调用“ls”会给出彩色输出,因为“ls”被别名为“ls --color=auto”,但第二种情况会给出没有颜色的输出,因为别名被绕过。

答案3

两个较旧的答案都是正确的,它们解释了 Bash 扩展别名的原因和时间。但是,如果您希望摆脱(烦人的)ls-alias,使某些目录列表在屏幕上的颜色过于相似而无法读取,则要删除的别名的定义位于文件 /etc/skel/.bashrc 中

相关内容