![为什么 Bash 会自动在函数中使用的 ls 命令中插入 --color=auto](https://linux22.com/image/158519/%E4%B8%BA%E4%BB%80%E4%B9%88%20Bash%20%E4%BC%9A%E8%87%AA%E5%8A%A8%E5%9C%A8%E5%87%BD%E6%95%B0%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%9A%84%20ls%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E6%8F%92%E5%85%A5%20--color%3Dauto.png)
我有这个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 中