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

$ 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. MySQL命令行下执行.sql脚本详解

    本文主要介绍一个在MySQL命令行下执行脚本文件的例子,通过这个例子让我们来了解一下在命令行下MySQL是怎样执行脚本的吧.现在我们开始介绍这一过程. 1.首先编写sql脚本,保存为的:book.sq ...

  2. 探索UDP套接字编程

    UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...

  3. Socket服务端和客户端(C++,CodeBlocks+GCC编译)

    //main.cpp 1 #include "j_socket.h" #include <stdio.h> #include <pthread.h> ; j ...

  4. MATLAB数字图像处理基础

    图像的输入.输出和显示 1.图像的输入    imread('filename'),  实际中写的是 >> f = imread('sky.jpg'); 2.图像的显示    imshow ...

  5. php中header函数参数的Cache-control:private,no-cache,must-revalidate,max-age是使用方法!

    由于我做的是登录,也就是用户登录每次登陆时都要来访问服务器,不需要在客户机做缓存,于是在网上找了找,发下一下文章不错于是传了上来.网页的缓存是由HTTP消息头中的“Cache-control”来控制的 ...

  6. Redis-基于php简单安装使用

    1.下载php相关redis扩展(apache选vc6),下载地址: https://github.com/phpredis/phpredis/downloads 2.修改php.ini,增加下面两项 ...

  7. Path Sum II

    Path Sum II Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals ...

  8. bzoj 3163: [Heoi2013]Eden的新背包问题

    Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...

  9. The week in .NET - 1/12/2015

    On.NET Last week, we had Mads Torgersen on the show to talk about language design in general, and C# ...

  10. 用table做网页,设置了border为1px怎么还是觉得很粗?

    设置边框重叠 border-collapse:collapse;  /*边框重叠*/ 例: <table width="700" style="border-col ...