环境中特殊参数“_”(单下划线)的用途是什么?

Win*_*nix 10 command-line bash

我试图了解如何使用环境变量_。下面是一个使用它的例子:

$ echo $_

$ echo $_
echo

$ ls non-existant-filename
ls: cannot access 'non-existant-filename': No such file or directory

$ echo $_
non-existant-filename
Run Code Online (Sandbox Code Playgroud)
  • 首先它什么都不返回
  • 其次它返回最后使用的命令
  • 最后它返回最后使用的参数

这对于 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)
Run Code Online (Sandbox Code Playgroud)
  • 第一个命令用于ll列出 python 脚本文件名。文件名被保存以_备将来使用。
  • 第二个命令$_运行 python 脚本。
  • 第三个命令cat $_列出了 python 脚本的内容。

所以$_变量/参数可以节省一些输入。

_ 包含最后运行的程序

以下是变量/参数之间差异envprintenv更新的示例_

$ env > env.txt

$ printenv > printenv.txt

$ diff env.txt printenv.txt
66c66
< _=/usr/bin/env
---
> _=/usr/bin/printenv
Run Code Online (Sandbox Code Playgroud)

由于参数未传递给任一命令,因此_不会像上一个示例中那样使用上次使用的参数进行更新,而是使用上次使用的命令进行更新。

还注意到如何在命令之前_更新并执行,因为它出现在输出中。envprintenv_

Tho*_*ard 11

它不是“环境变量”。这是一个特殊的 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
Run Code Online (Sandbox Code Playgroud)