shell - shell 别名什么时候生效?
问题描述
我阅读了 POSIX 规范中的“别名替换”部分,但似乎无法弄清楚这一点。
考虑这两个脚本:
alias x="echo hello"
x
和
if true; then
alias x="echo hello"
x
fi
在我测试的两个 shell(dash 和 zsh)中,它们都有相同的行为。第一个脚本打印“hello”,第二个脚本产生错误,因为x
它不是命令。
complete_command
从这些测试来看,别名似乎在 POSIX 语法中 next 的开头生效。如果是这种情况,它在 POSIX 规范中的位置是什么?
解决方案
请参阅POSIX 规范以了解别名替换。
别名替换发生在解析期间(或至少在评估之前)。因为整个if
语句是一个一次性解析的复合命令,这意味着在前面的命令实际定义别名之前x
进行别名替换,并且只能被在语句之前在完整命令行上定义的别名替换。alias
if
例如,考虑代码
alias x="echo hello"
if true; then
x
fi
解析后,转换为代码
alias x="echo hello"
if true; then
echo hello
fi
这就是实际执行的代码。
现在考虑
alias x="echo hello"
if true; then
alias x="echo goodbye"
x
fi
x
同样,在if
解析语句时,x
定义为echo hello
,而不是echo goodbye
。但是在if
解析执行之后,x
已经重新定义了,所以上面的等价于
alias x="echo hello"
if true; then
alias x="echo goodbye"
echo hello
fi
echo goodbye
推荐阅读
- sql - 有没有办法在火花中创建所有列的列表
- c# - Hangfire 与 AspNet Core 3.1 控制台应用程序 DI 错误对象的集成与目标类型不匹配
- reactjs - 当我将对象作为道具传递时,纯组件就像普通组件一样工作?
- angular - Angular:捕获动态容器内发出的事件
- log4j - databricks 无法解析自定义日志附加程序
- javascript - 当父状态更新时,子道具不会
- java - 按下回车键后CMD停止获取代码结果
- python - 如何根据指标进行计算?
- spring-boot - 如何使用自定义构建的 JWT 来保护我的 API _WITHOUT_ 使用 oauth2
- javascript - 解析JSON文件时,我可以用变量零替换我的Javascript中的int吗