如何在 bashrc 中使用别名时测试可能的冲​​突?

如何在 bashrc 中使用别名时测试可能的冲​​突?

有没有一种简单的方法可以列出系统中由于 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仅输出两者共有的那些行。

相关内容