如何测试是否定义了特定别名?

如何测试是否定义了特定别名?

我有一个 bash 脚本,如果定义了特定的别名,则该脚本需要有不同的行为。有没有办法测试特定命令是否是 bash 中的别名?

答案1

如果alias传递的别名不带=value,则如果定义了该别名,则仅打印别名定义;如果不存在此类别名,则失败并显示错误。

所以你可以这样做:

if alias your_alias_name >/dev/null 2>&1; then 
  do_something
else 
  do_another_thing; 
fi

your_alias_name根据需要更换)

答案2

我要做@jimmij 5 年前的评论进入答案:

type -t正是为了这个目的而设计的。alias如果给定的命令是别名,它将输出。如果该命令不存在,它将不会输出任何内容,这意味着您不需要重定向其 stderr 或其他内容。

例子:

if [ "$(type -t foo)" = 'alias' ]; then
    echo 'foo is an alias'
else
    echo 'foo is not an alias'
fi

-t请注意, POSIX 中未定义该开关。 bash 以外的 shell 可能无法实现它。

答案3

警告的话:

Shell 函数和别名仅限于 shell,在执行的 shell 脚本中不起作用。

在发现https://askubuntu.com/a/98796,我自己的惨痛经历证实了这一点。

有点烦人的是,这在文档中没有明确提及Bash 用户手册的相关部分,唯一的提示是

默认情况下会执行别名扩展(请参阅别名)。

这对我来说不够直观; YMMV。

简而言之,其他答案中提到的所有技术仅当您检查同一脚本中定义的别名时才有效(或者在另一个文件中source-d 进入脚本)。您无法从(非交互式)脚本中检查调用该脚本的 shell 中是否定义了别名。

aliastest.sh这是一个演示该问题的小脚本:

#!/usr/bin/env bash

shopt -s expand_aliases

is_alias() {
    if [[ "$(type -t $1)" == "alias" ]]; then
        echo "$1 is an alias"
    else
        echo "Cannot find $1"
    fi
}

# == MAIN ==

if [[ $# -lt 1 ]]; then
    echo "Usage: $0 <command> [ <command> ...]"
    exit 1
fi

for cmd in $@; do
    is_alias $cmd
done

假设您ll使用命令在 shell 中定义了常用别名alias ll='ls -alF'(您可能已经拥有它)。如果您运行./aliastest.sh ll它,它会告诉您Cannot find ll

但不要绝望,有一个解决方法:

如果您告诉 Bash 以“交互式”方式运行您的脚本,那么它将“看到”您调用它的 shell 中定义的别名:

bash -i aliastest.sh ll

它会回答ll is an alias

答案4

你可以这样写

[[ $(type your_alias) == *"alias" ]] && echo "alias defined" || echo "alias undefined"

例子:

[[ $(type fd) == *"alias" ]] && echo "fd is an alias" || echo "fd is not an alias"

另一种选择可以是

[[ -z $(alias | grep 'll=') ]] && echo "alias not found" || echo "alias found"

相关内容