shell 中 true command的分析

最近看大神以前写的,遗留下来的shell脚本时,发现一个有意思的命令

true ${var:=var1}

当时百思不得解,各种百度,请教朋友,就在刚刚吃完晚饭,大概明白怎么回事儿了,所以记录下来。。
要理解 true ${var:=var1},首先要理解${var:=var1}
${var:=var1}:当var没有声明,或者为空值时,${var:=var1}就等于var1,而且var也会赋值为var1.
所以我们在终端执行时,会出现下面的情况:

zhangsan@ubuntu:~$ echo $var

zhangsan@ubuntu:~$ ${var:=var1}
var1:未找到命令
zhangsan@ubuntu:~$

当我们只想安静的给var赋值时,通常就是tmp=${var:=var1}这种方式,但是这种方式会多一个无用的,我们不想要的变量tmp,当然你如果不是一个强迫症患者也无所谓。
还有一种就是

true ${var:=var1}

这里就要了解true的工作机制,true 的作用就是忽略参数,什么都不执行,然后返回0。man true结果如下。

TRUE(1)                          User Commands                         TRUE(1)

NAME
       true - do nothing, successfully

SYNOPSIS
       true [ignored command line arguments]
       true OPTION

DESCRIPTION
       Exit with a status code indicating success...

具体的问题是,在我执行true touch ~/test的时候,test文件根本没有创建,这就与我刚开始的认知有冲突了。
为什么true ${var:=var1}就会将var1赋值给var,但是touch ~/test为什么就没执行呢?

首先,还是要明确一下true命令,true command其实是不执行command,这也就是为什么touch ~/test没有生效。那么${var:=var1}会被执行呢?关键其实跟shell命令的执行过程有关系的。
参考:http://www.jb51.net/article/33487.htm
shell的执行流程图如下:

image.png

true ${var:=var1}执行时,会按照上面的流程,${var:=var1}在第5步变量替换处执行了。在第10步的时候,true忽略了所有的参数,什么都不做,然后返回。
${var:=var1}的执行,不是true去执行,而是shell的固定流程。所以true ${var:=var1}既会执行${var:=var1},也会忽略${var:=var1}的结果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 为何叫做 shell ? shell prompt(PS1) 与 Carriage Return(CR) 的关系?...
    Zero___阅读 3,212评论 3 49
  • 一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工...
    架构师小秘圈阅读 8,743评论 3 70
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,200评论 19 139
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,256评论 2 33
  • 1.建立和运行shell程序 什么是shell程序呢? 简单的说shell程序就是一个包含若干行shell或者li...
    运维阿文阅读 1,520评论 0 9