当前位置: 首页 > news >正文

Bash 中为 _ 变量赋空值的三个场景

$_ 有好几个功能,我们最常用的是用它来获取“刚刚执行过的命令的最后一个参数”这个功能,比如下面这样:

$ ls ~/Downloads/very/long/dir/  # ls 到某个目录看看有没有我们想要的文件

file1 file2 needed_file

$ cd $_ # 如果有,就进入到那个文件夹,$_ 让你省去了不少键盘敲击数  

Bash manual 中对 $_ 的这个功能的描述只有一句话:

expands to the last argument to the previous command, after expansion.

惜字如金,让你觉的这个功能真的很简单,但稍微深入想一想,如果上次执行的命令完全没有参数呢?

$ echo # 没有参数

$ echo $_

echo

哦哦,这下我们知道了,如果一个参数也没有,那么 $_ 就是命令的名字本身。那么问题又来了,如果命令的名字也没有呢?有些同学就问了,怎么写出一个连命令名也没有的命令呢。其实在 Shell 里面,一条简单命令的组成文法大概是这个样子的:

赋值语句 命令名和参数 重定向

比如 foo=1 bar baz >qux 就是三个部分都存在的命令,但其实,这个三个部分只要存在一个部分就算是一条简单命令了,不信我们试试:

$ foo=1 # 只有第一部分,这也是一条命令,很熟悉吧,就是我们常见的赋值语句

$ foo=1 > bar # 没有第二部分,这也可以

$ >bar # 只有第三部分,还可以

下面就说结论了:当没有命令名和参数这一部分的时候,Bash 会给 _ 赋空值:

$ : foo

$ echo $_ # _ 的值是 foo

foo

$ foo=1

$ echo "左边$_右边" # _ 的值被 Bash 赋值为空,这种情况在 zsh 下只是不更新 _ 的值,还是 foo,但不会赋空值

左边右边

$ : foo

$ > bar

$  echo "左边$_右边" # 同样,又被赋值为空,zsh 下还会是 foo

左边右边

除了这种没有命令名和参数的场景,还有两种情况下 Bash 会给 _ 赋空值,一个是包含管道的命令,再一个是后台(异步)执行的命令:

$ : foo

$ echo 1 | echo 2

2

$ echo "左边$_右边" # _ 为空,在 zsh 下会是最后一个管道右边的命令的最后一个参数,也就是 2

左边右边

$ echo 1 &

$ echo "左边$_右边" # _ 还是空,在 zsh 下没有特殊处理,是 1

左边右边

还有一个 Bash 文档没明确指出的点,那就是只有简单命令才会更新 _ 的值,管道命令,命令列表,复合命令这些命令本身,都不会更新 _ 的值,但它们包含的简单命令要是执行了的话是会影响的(比如 for 循环里的简单命令没有执行的话,不会更新 _,反之亦然)。

相关文章:

  • UVA 11235 Frequent values (RMQ )
  • [LeetCode]Balanced Binary Tree
  • 导入myeclipse项目出现的问题及解决方案
  • 多线程--多线程断点下载
  • 《代码整洁之道》第十二章:跌进
  • django 1.8 官方文档翻译:5-1-2 表单API
  • iOS--警告收录及科学快速的消除方法
  • java环境变量设置
  • jdk 安装配置
  • jsp中文显示乱码的解决办法
  • 携程App for Apple Watch探索
  • 从头开始敲代码之《从BaseApplication/Activity开始(三)》
  • 前端性能优化(十)
  • 汇编语言HelloWorld
  • n个元素的入栈顺序有多少种出栈顺序?
  • 分享的文章《人生如棋》
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Android开源项目规范总结
  • Bootstrap JS插件Alert源码分析
  • ECMAScript入门(七)--Module语法
  • happypack两次报错的问题
  • Iterator 和 for...of 循环
  • Java方法详解
  • Mac转Windows的拯救指南
  • socket.io+express实现聊天室的思考(三)
  • Travix是如何部署应用程序到Kubernetes上的
  • 第十八天-企业应用架构模式-基本模式
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 回顾2016
  • 力扣(LeetCode)22
  • 两列自适应布局方案整理
  • 数据可视化之 Sankey 桑基图的实现
  • 我的面试准备过程--容器(更新中)
  • 小程序button引导用户授权
  • 小程序测试方案初探
  • Hibernate主键生成策略及选择
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $forceUpdate()函数
  • (16)Reactor的测试——响应式Spring的道法术器
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二十四)Flask之flask-session组件
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (四)图像的%2线性拉伸
  • (译)2019年前端性能优化清单 — 下篇
  • (正则)提取页面里的img标签
  • (转)Mysql的优化设置
  • (转)Sublime Text3配置Lua运行环境
  • .axf 转化 .bin文件 的方法
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET 材料检测系统崩溃分析
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .vue文件怎么使用_vue调试工具vue-devtools的安装