有没有一种简单的方法可以列出系统中由于 bashrc 更新涉及别名命令而发生的所有命令冲突?
例如,有人alias ls=/path/to/user-generated/executable
在bashrc中写入。如何发现这是掩盖了实际命令 ( ls
)。一种方法似乎是在获取 bashrc 之前和之后运行所有别名并比较输出。还有更好的方法吗?
我运行的是 Ubuntu 12.04。
bash --版本
GNU bash,版本 4.2.24(1)-release (i686-pc-linux-gnu)
答案1
您可以使用type
来了解 bash 如何解释命令。
答案2
要找出哪些命令被别名屏蔽,请执行以下操作:
alias |
awk -F '[ =]+' '{print $2}' |
while read cmd; do
type -ta "$cmd" | grep -q file \
&& printf "%s is overloaded: \"%s\"\n" "$cmd" "$(alias $cmd)"
done
解释
alias
单独列出定义的别名并awk
提取它们的名称。 while 循环type -ta
对它们中的每一个运行并grep
检查是否有一个也是file
.
答案3
作为你的第一个问题,没有办法列出冲突,因为 bash 在内部使用哈希表,它只记录最后一次覆盖。
要查明命令是否是别名,请alias ls
根据您的情况使用,如果它告诉您类似“未找到”的内容,则它不是别名,否则就是别名。
要启动原始函数而不考虑别名,请在前面加上斜杠,例如\ls
将启动真正的散列 ls,忽略别名。
编辑
如果你想快速知道命令是否是别名,你可以通过 启用调试模式set -x
,现在如果你执行ls
:
您将看到正在执行的实际命令的调试输出
要取消设置调试模式,请使用set -
答案4
您可以使用 bash 内置命令compgen
来获取所有命令和所有别名的列表compgen -ac
。任何同时也是别名的命令都将在此列表中重复,因此简单的简单解决方案是在 的输出中查找重复项compgen -ac
。
但是,如果命令在路径上出现两次,也可能会出现重复项。例如,我已经/bin/which
并且/usr/bin/which
因此compgen -ac
将列出which
两次,即使它不是别名。
因此,需要的是从中获取所有重复项compgen -ac
并将其与别名列表进行比较。只有同时也是别名的重复项才是隐藏命令的别名。我们可以使用comm(1)
命令和 bash 进程替换来完成此操作。
comm -12 <(compgen -a | sort) <(compgen -ac | sort | uniq -d)
compgen -a | sort
是所有别名的列表(按 排序comm
)。compgen -ac | sort | uniq -d
是命令和别名列表中所有重复项的列表。comm -12
仅输出两者共有的那些行。