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

$ 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 循环里的简单命令没有执行的话,不会更新 _,反之亦然)。

Bash 中为 _ 变量赋空值的三个场景的更多相关文章

  1. Bash 中的 _ 是不是环境变量

    首先,我们想到的会是 export(等价于 declare -x)命令: $ export | grep 'declare -x _=' 没有找到,那么结论就是 _ 不是环境变量?当然没那么简单,否则 ...

  2. bash 中的特殊变量

    bash 中的特殊变量 变量 说明 ------------------------------------ $0 当前脚本的文件名 $n 第n个位置参数 $* 传递给脚本或函数的所有参数,$*会将这 ...

  3. jsp中把js变量赋给java变量,或者将java变量赋给js变量怎么做?

    在jsp中经常会遇到把js变量赋给java变量,或者将java变量赋给js变量的情况,在此将通用的处理方法小结如下: java变量传给js好办,var a=”<%=javaParam%>“ ...

  4. Bash 中的环境变量

    在 Bash 里,可以通过 export 命令查看当前 Shell 进程的环境变量,这些环境变量一些是 Bash 自己创建的,还有一些是 Bash 从父进程继承来的,然而需要注意的是,父进程传给 Ba ...

  5. Bash中的特殊变量和位置参量

    位置参量:向脚本或函数传递的参数,可以被set命令设置.重置和清空. 1.$$ 当前Shell的PID 2.$- 当前Shell的选项,如果是交互式shell,应该包含字符i,例如$ echo $-h ...

  6. Bash中的字符串变量扩展

    1.向尾部方向的最小化删除 (%) $pathname="/usr/bin/local/bin"$echo ${pathname%/bin*}/usr/bin/local 2.向尾 ...

  7. Bash中的变量

    Bash中的变量1.用户定义的变量变量的定义  用户定义的变量有字母数字及下划线组成,并且变量名的第一个字符不能为数字.            与其它UNIX名字一样,变量名是大小写敏感的. 对于变量 ...

  8. bash 中的变量

    bash 中的变量 Linux command line 笔记 变量无需声明,自动创建 var=abc #变量a赋值为字符串abc var="hello world" #字符串里有 ...

  9. bash的循环中无法保存变量

    在bash中,如果循环在一个子shell中运行,那么在循环中对循环外面的变量的更改将在循环退出后不可见.像下面的例子: #!/bin/sh python run.py | while read lin ...

随机推荐

  1. diff/merge configuration in Team Foundation - common Command and Argument values - MSDN Blogs

    One of the extensibility points we have in Team Foundation V1 is that you can configure any other di ...

  2. 架构实例之Demo_JSP_JavaBean

    架构实例之Demo_JSP_JavaBean 1.开发工具和开发环境      开发工具: MyEclipse10,JDK1.6.0_13(32位),Tomcat7.0(32位),mysql5.7.1 ...

  3. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  4. Caffe源码解析7:Pooling_Layer

    转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ Pooling 层一般在网络中是跟在Conv卷积层之后,做采样 ...

  5. 解决“只能通过Chrome网上应用商店安装该程序”的方法

    摘要 : 最近有些用户反映某个Chrome插件在安装的时候,提示"只能通过Chrome网上应用商店安装该程序",为了解决这一问题,Chrome插件网带来了相关的解决方法. 某些用户 ...

  6. 《JavaScript高级程序设计》笔记整理

    欢迎各位指导与讨论 : ) -------------------------待续------------------------------- 本文为笔者在学习时整理的笔记,如有错漏,恳请各位指出, ...

  7. Python-12-MySQL & sqlalchemy ORM

    MySQL MySQL相关文章这里不在赘述,想了解的点击下面的链接: >> MySQL安装 >> 数据库介绍 && MySQL基本使用 >> MyS ...

  8. AVA数据库连接池.

    package db_pool; //// 一个效果非常不错的JAVA数据库连接池.// from:http://www.jxer.com/home/?uid-195-action-viewspace ...

  9. Android5.0资源 colorAccent,colorPrimary,colorPrimaryDark

  10. 微信小程序之触控事件(四)

    [未经作者本人同意,请勿以任何形式转载] >>>什么是事件 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 事件可以绑定在组件上,当达到触发事件,就会执 ...