如何获取Shell别名的未引用值以复用别名定义?
解决bash别名复用的问题
问题场景
已定义别名:
alias e='eza --long --recurse --dereference …'
需要创建变体别名et,在原命令后追加--tree选项,但不想重复写原命令的参数。尝试直接用$(alias e)会得到带alias e='...'的完整输出,无法直接复用。
可行解决方案
1. 用sed提取别名的无引号值
通过sed匹配alias e的输出格式,提取出引号内的命令内容:
alias et="$(alias e | sed -E "s/alias e='(.*)'/\1/") --tree"
如果原别名使用双引号定义,调整sed的匹配规则:
alias et="$(alias e | sed -E 's/alias e="(.*)"/\1/') --tree"
2. 纯bash参数扩展处理
借助bash的参数扩展功能,逐步剥离alias e输出中的多余部分:
# 先获取完整的别名定义 e_alias_def=$(alias e) # 去掉开头的"alias e="前缀 e_cmd=${e_alias_def#alias e=} # 去掉首尾的引号(这里以单引号为例,双引号同理替换) e_cmd=${e_cmd#\'} e_cmd=${e_cmd%\'} # 定义新别名 alias et="$e_cmd --tree"
这种方法不依赖外部工具,仅用bash自身特性完成,兼容性更好。
3. 提前用变量存储基础命令(推荐)
如果可以修改原别名的定义方式,先把基础命令存到变量中,再基于变量定义两个别名,从根源避免重复代码:
# 存储基础命令 E_BASE_CMD='eza --long --recurse --dereference …' # 定义原别名 alias e="$E_BASE_CMD" # 定义变体别名 alias et="$E_BASE_CMD --tree"
后续修改基础参数时,只需更新变量即可,维护更高效。
内容的提问来源于stack exchange,提问作者daxim
相关产品推荐
相关产品推荐

