我有一个 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"