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

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

我正在尝试了解如何_使用环境变量。下面是使用它的示例:

$ 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(手册页此部分手册页的链接)

相关内容