POSIX Shell中$(...)赋值存命令还是结果?调用变量时命令是否重复执行?
嘿,这个问题问到点子上了——这可是Shell脚本入门时很容易踩坑的细节,我给你拆解明白:
1.
variable=$(...)存储的是命令执行结果,而非命令本身 在POSIX Shell里,$(...)叫做命令替换(command substitution),它的工作逻辑是:
- 先执行括号里的完整命令,捕获该命令输出到标准输出的内容(会自动去掉末尾的换行符)
- 把捕获到的内容赋值给等号左边的变量
举个直观的例子:
current_time=$(date) echo $current_time
这里current_time变量里存的是你执行这行代码时date命令输出的时间字符串(比如Wed Oct 11 14:35:22 CST 2024),绝对不是date这个命令本身。如果想存命令文本,你得用单引号把命令包起来:cmd='date',这时候变量才是命令字符串。
2.
list=$(ps -ax)仅执行一次,后续调用变量不会重新执行命令 当你写下list=$(ps -ax)这行代码时,Shell会在执行这条赋值语句的瞬间,一次性运行ps -ax命令,把当时的进程列表输出全部存到list变量里。
之后不管你多少次调用$list(比如echo $list、grep ssh $list),都是直接读取变量里已经保存好的那次进程列表,不会再重新执行ps -ax。举个场景:你赋值后过了10分钟再打印$list,看到的还是10分钟前的进程状态,不是当前的。
如果想要每次获取最新的进程列表,你就不能把结果存在变量里,要么每次直接写ps -ax,要么把命令封装成函数:
get_processes() { ps -ax }
之后每次调用get_processes,都会重新执行一次ps -ax。
内容的提问来源于stack exchange,提问作者Human_BetaRelease
相关产品推荐
相关产品推荐

