如何在bashrc中检查别名是否已设置

40

我该如何在我的.bashrc中检查别名是否已经设置。

当我引用一个.bashrc文件时,其中有一个函数名称,比如说fun,而我的当前环境也有一个别名作为fun

我尝试使用unalias fun,但当我的环境没有该别名时,这将导致错误fun not found。

因此,在我的.bashrc中,我想要在我的fun函数中检查是否设置了别名,然后unalias它。

9个回答

49
如果您只想确保别名不存在,只需取消别名并将其错误重定向到 /dev/null,就像这样:

如果您只想确保别名不存在,只需取消别名并将其错误重定向到 /dev/null,就像这样:

unalias foo 2>/dev/null
您可以通过以下方式检查别名是否设置:
alias foo >/dev/null 2>&1 && echo "foo is set as an alias" || echo "foo is not an alias"

如man手册所述:

For each name in the argument list for which no  value  is  sup-
plied,  the  name  and  value  of  the  alias is printed.  Alias
returns true unless a name is given for which no alias has  been
defined.

1
@BrianHorakh 我猜你是指下面的答案 :) 我的代码没有使用 grep - mitchnull
请注意,此解决方案可能存在难以发现的打字错误。例如,unaalias foo 2>/dev/null || echo "The foo alias existed and has been undefined"即使不存在也会始终打印它存在,并且如果存在也不会取消定义;您永远不会看到告诉您实际情况的bash:unaalias:command not found错误消息。我建议使用Bob Stack的答案,它没有这个问题;它确保您将看到与编程错误相关的错误消息。 - cjs
这是一个针对Bash的补丁,用于添加-qunalias命令 :)。补丁链接:https://github.com/bminor/bash/compare/master...mitchnull:bash:add-quiet-mode-to-unalias。 - mitchnull

15

只需使用命令alias,例如:

alias | grep my_previous_alias

请注意您 实际上可以 使用 unalias 命令,这样您就可以执行类似以下的操作:

[ `alias | grep my_previous_alias | wc -l` != 0 ] && unalias my_previous_alias

如果已经设置了别名,那么这将删除该别名。


我用这个来测试我的Mac和Linux机器之间有没有 la。在我的Mac的.bash_profile文件中,我有alias la='ls -GA'(因为G代表彩色),然后在我的.bashrc文件中,我有function checkLa(){ if [ "$(alias | grep la)" == "ls -GA" ]; then echo "mac user!"; return 0; fi echo "linux user!"; alias la='ls -A --color=auto' }; checkLa()。我知道alias会返回所有的别名,但我只是没有想到它!:D - dylnmc
2
你可能存在一个bug,直到你加强grep即:alias -p | grep "foo=",通过使用等号,可以减少部分匹配的风险,在我的情况下,别名非常短(两个字符),因此会错误地触发其他匹配。 - Brian Horakh

8

您可以使用type命令来查看命令是否存在,或者它是否是别名。

如果找不到该命令,则会返回错误状态。

例如,我正在定义以下别名:

$ alias foo="printf"

接下来请检查以下情况:

$ type foo >/dev/null && echo Command found. || echo Command not found.
Command found.

或者特定于别名:

$ alias foo && echo Alias exists || echo Alias does not exist.

或者检查它是别名还是普通命令:

$ grep alias <(type foo) && echo It is alias. || echo It is not.

要检查别名是否在您的rc文件中定义,需要手动检查,例如:

[ "$(grep '^alias foo=' ~/.bash* ~/.profile /etc/bash* /etc/profile)" ] && echo Exists. || echo Not there.

6

检查别名的好方法是使用 BASH_ALIASES 数组,例如:

$ echo ${BASH_ALIASES[ls]}

2
[[ ${BASH_ALIASES[foo]} ]] && unalias foo 这样做就可以了,对吧? - codeforester
这似乎是最干净的方式,没有涉及任何外部命令。 - codeforester
@codeforester, [[ ${BASH_ALIASES[foo]} ]] && unalias foo 是不正确的(别名可能存在但为空:alias foo=)。我改用了 [[ -v BASH_ALIASES[foo] ]] && unalias foo - Bruno

6
# Test if alias of name exists, and then remove it:
[ "$(type -t name)" = "alias" ] && unalias name

# Test if function of name exists, and then remove it:
[ "$(type -t name)" = "function" ] && unset -f name

2
这是一个不错的技术解决方案。 - WestCoastProjects
2
但是我得到了“错误选项:-t”。 - Frank Fang
你可能没有使用bash? - Bob Stack
我正在Windows上使用gitbash。 - Frank Fang
请查看您的文档。 "Git for Windows提供了BASH仿真..."。仿真可能不是完整的实现。 - Bob Stack
显示剩余2条评论

2
您可以使用以下方法使您的bashrc文件更简单:
  1. 确保别名存在。
  2. 取消别名。
  3. 定义函数。

alias fun=''
unalias fun
fun ()
{
   # Define the body of fun()
}

1
这里
if alias <your_alias_name> 2>/dev/null; then 
  do_something
else 
  do_another_thing; 
fi

0

我使用类似于@noonex提出的方案,但可以处理空别名:

[[ -v BASH_ALIASES[foo] ]] && unalias foo

这将起作用,即使foo别名存在但为空:
alias foo=
[[ ${BASH_ALIASES[foo]} ]] && echo unalias1
[[ -v BASH_ALIASES[foo] ]] && echo unalias2

输出:

unalias2

如果您需要像@codeforester的解决方案一样的函数,则应相应更改${BASH_ALIASES[$alias_name]}


0

根据noonex的答案编写了这个函数:

unalias_if() {
    local alias_name
    for alias_name; do
        [[ ${BASH_ALIASES[$alias_name]} ]] && unalias "$alias_name"
    done
}

并且可以安全地调用

unalias_if alias1 alias2 ...

1
最好使用[[ -v BASH_ALIASES[$alias_name] ]] - Bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接