Bash脚本中source文件后别名ll无法生效,原因是什么?
问题原因及解决办法
原因
bash在非交互式模式(比如执行.sh脚本)下,默认禁用了别名扩展功能。而终端操作属于交互式模式,bash默认开启别名扩展,所以直接source sourceme后ll能正常使用。
脚本执行时,即便source了定义别名的文件,由于未开启别名扩展,bash无法识别ll这个别名,因此报错"command not found"。
解决办法
有两种常见处理方式:
- 在脚本中开启别名扩展
在source sourceme前添加shopt -s expand_aliases命令,让bash允许扩展别名:
shopt -s expand_aliases source sourceme ll
- 用函数或直接命令替代别名
别名主要为交互式shell设计,脚本里更推荐用函数或直接写完整命令,避免依赖别名扩展:
- 直接使用完整命令:
source sourceme ls -l
- 或者在
sourceme里定义函数代替别名(兼顾脚本和交互式环境):
# sourceme文件内容修改为 ll() { ls -l "$@"; }
内容的提问来源于stack exchange,提问作者k_vishwanath
相关产品推荐
相关产品推荐

