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 循环里的简单命令没有执行的话,不会更新 _,反之亦然)。
Bash 中为 _ 变量赋空值的三个场景的更多相关文章
- Bash 中的 _ 是不是环境变量
首先,我们想到的会是 export(等价于 declare -x)命令: $ export | grep 'declare -x _=' 没有找到,那么结论就是 _ 不是环境变量?当然没那么简单,否则 ...
- bash 中的特殊变量
bash 中的特殊变量 变量 说明 ------------------------------------ $0 当前脚本的文件名 $n 第n个位置参数 $* 传递给脚本或函数的所有参数,$*会将这 ...
- jsp中把js变量赋给java变量,或者将java变量赋给js变量怎么做?
在jsp中经常会遇到把js变量赋给java变量,或者将java变量赋给js变量的情况,在此将通用的处理方法小结如下: java变量传给js好办,var a=”<%=javaParam%>“ ...
- Bash 中的环境变量
在 Bash 里,可以通过 export 命令查看当前 Shell 进程的环境变量,这些环境变量一些是 Bash 自己创建的,还有一些是 Bash 从父进程继承来的,然而需要注意的是,父进程传给 Ba ...
- Bash中的特殊变量和位置参量
位置参量:向脚本或函数传递的参数,可以被set命令设置.重置和清空. 1.$$ 当前Shell的PID 2.$- 当前Shell的选项,如果是交互式shell,应该包含字符i,例如$ echo $-h ...
- Bash中的字符串变量扩展
1.向尾部方向的最小化删除 (%) $pathname="/usr/bin/local/bin"$echo ${pathname%/bin*}/usr/bin/local 2.向尾 ...
- Bash中的变量
Bash中的变量1.用户定义的变量变量的定义 用户定义的变量有字母数字及下划线组成,并且变量名的第一个字符不能为数字. 与其它UNIX名字一样,变量名是大小写敏感的. 对于变量 ...
- bash 中的变量
bash 中的变量 Linux command line 笔记 变量无需声明,自动创建 var=abc #变量a赋值为字符串abc var="hello world" #字符串里有 ...
- bash的循环中无法保存变量
在bash中,如果循环在一个子shell中运行,那么在循环中对循环外面的变量的更改将在循环退出后不可见.像下面的例子: #!/bin/sh python run.py | while read lin ...
随机推荐
- kmeans算法实践
这几天学习了无监督学习聚类算法Kmeans,这是聚类中非常简单的一个算法,它的算法思想与监督学习算法KNN(K近邻算法)的理论基础一样都是利用了节点之间的距离度量,不同之处在于KNN是利用了有标签的数 ...
- 【2016-11-3】【坚持学习】【Day18】【ADO.NET 】
使用Connection创建数据库连接 使用Command创建命令 使用ExecuteScalar,ExecuteNonQuery,ExecuteReader方法来执行命令 使用DataReader来 ...
- 并查集补集作法 codevs 1069 关押罪犯
1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description ...
- Windows+Linux----打造和谐的开发环境
其实Windows和Linux并非水火不容,相反,我觉得,如果将二者结合起来,取长补短,便可打造一个华丽.实用的开发环境. 吾以为,不会用linux的人,不能称为一个程序猿,但是一味觉得Linux很吊 ...
- jenkins,jmeter,ant报告模板
http://www.cnblogs.com/yangxia-test/p/5283139.html
- java数组初始化函数
用法1:接受2个参数Arrays.fill( a1, value );注:a1是一个数组变量,value是一个a1中元素数据类型的值,作用:填充a1数组中的每个元素都是value例如:boolean[ ...
- [No00007A]没有文件扩展".js"的脚本引擎 解决办法
在命令行运行JScript脚本时,遇到如下的错误提示: “输入错误: 没有文件扩展“.js”的脚本引擎.” 这样的错误,原因是因为JS扩展名的文件被其他软件关联了,需要取消关联. 如系统中安装了ULT ...
- WebApi2跨域问题
一.跨域问题产生的原因:同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能. 现在所有支持JavaScript 的浏览器都会使用这个策略. 所谓同源是指,域 ...
- 容器化redis高可用方案
偶然看到一个GITHUB项目,提供了一套Docker Compose下的redis Sentinel方案. 项目地址https://github.com/AliyunContainerService/ ...
- 【原】关于使用sklearn进行数据预处理 —— 归一化/标准化/正则化
一.标准化(Z-Score),或者去除均值和方差缩放 公式为:(X-mean)/std 计算时对每个属性/每列分别进行. 将数据按期属性(按列进行)减去其均值,并处以其方差.得到的结果是,对于每个属 ...