我正在尝试了解如何_
使用环境变量。下面是使用它的示例:
$ echo $_
$ echo $_
echo
$ ls non-existant-filename
ls: cannot access 'non-existant-filename': No such file or directory
$ echo $_
non-existant-filename
- 首先它什么也没有返回
- 其次它返回最后使用的命令
- 最后返回最后使用的参数
对于 bash 脚本来说,这可能是一个方便的变量,但只有完全理解它的功能时才可以。
一些有用的应用_
我发现了一些有用的应用程序_
。
_
包含最后一个可以回收的文件名
在此示例中_
,用于保留最后一个文件名,您可以在后续命令中重复使用该文件名,而无需重新输入它。
$ ll ~/python/scroll1.py
-rwxrwxrwx 1 rick rick 2384 Dec 27 09:15 /home/rick/python/scroll1.py*
$ $_
# The python program ~/python/scroll1.py is executed
$ cat $_
#!/usr/bin/env python
# -*- coding: utf-8 -*-
(... SNIP ... remaining contents of ~/python/scroll1.py appears on screen)
- 第一个命令用于
ll
列出 Python 脚本文件名。文件名将被保存_
以供将来使用。 - 第二条命令
$_
运行python脚本。 - 第三个命令
cat $_
列出了 python 脚本的内容。
因此$_
变量/参数可以节省一些输入。
_
包含最后运行的程序
env
以下是与printenv
更新_
变量/参数之间的差异的示例:
$ env > env.txt
$ printenv > printenv.txt
$ diff env.txt printenv.txt
66c66
< _=/usr/bin/env
---
> _=/usr/bin/printenv
因为没有向任何一个命令传递参数,所以_
不会像上例那样使用最后使用的参数进行更新,而是使用最后使用的命令进行更新。
还注意到如何_
更新前命令env
并被printenv
执行,因为_
它出现在输出中。
答案1
它不是“环境变量”。它是一个由 Bash 专门处理的特殊 Bash 参数。
从Bash 初学者指南这很好地解释了 Bash 的情况:
3.2.5. 特殊参数
shell 对几个参数有特殊处理。这些参数只能被引用;不允许赋值。
...
$_
:下划线变量在 shell 启动时设置,包含传入参数列表的正在执行的 shell 或脚本的绝对文件名。随后,它在扩展后扩展为上一个命令的最后一个参数。它还设置为执行的每个命令的完整路径名,并放置在导出到该命令的环境中。检查邮件时,此参数保存邮件文件的名称。
(引文格式针对 Ask Ubuntu 进行了调整,但包含所有信息)
它们还包括一个如何$_
扩展的很好的例子:
franky ~> grep dictionary /usr/share/dict/words dictionary franky ~> echo $_ /usr/share/dict/words
该参数的解释_
也可以在 Bash 手册页 ( man bash
) 下的PARAMETERS/Special Parameters
(手册页此部分手册页的链接)