在命令行参数中,"-"(短横线)的神奇之处是什么?

144

示例:

  • 创建ISO镜像并直接刻录到CD上。

    mkisofs -V Photos -r /home/vivek/photos | cdrecord -v dev=/dev/dvdrw -

  • 切换到上一个目录。

    cd -

  • 监听12345端口并解压发送到该端口的数据。

    nc -l -p 12345 | tar xvzf -

短横线的作用是什么,我该如何使用它?

5个回答

151

如果你是指 tar 命令末尾的裸横线 - ,那在很多需要使用文件的命令中都很常见。

它允许你指定标准输入或输出,而不是一个实际的文件名。

这就是你第一个和第三个示例的情况。比如 cdrecord 命令正在获取标准输入(由 mkisofs 产生的 ISO 映像流),并将其直接写入 /dev/dvdrw 中。

在 cd 命令中,每次更改目录时,它都会存储你来自的目录。如果你使用特殊的“-”目录名执行 cd 命令,则它将使用那个记忆的目录,而不是真正的目录。你可以通过使用它来快速切换两个目录。

其他命令可能将“-”作为不同的特殊值处理。


22
注意,你也可以使用-来代替Git分支名进行操作,例如,你可以通过运行命令git checkout -切换回之前的分支。请注意在翻译过程中保持原意不变,尽量让内容通俗易懂。 - snappieT
4
在tar文档的哪个部分解释了它的支持?我怎样知道哪些命令支持它? - user146043
2
如果一个命令对“-”有特殊含义,你可以在man手册中找到它的解释。 - codeforester
su - #将shell变成登录shell - atongsa
@elmclose 我自己也是个新手,但我的理解是:Pipe 是一种内置构造。它将第一个命令的 stdout 连接到第二个命令的 stdin。但是,由命令的作者决定如何处理 stdin。并不能保证每个命令都会实际读取 stdin,但 - 已成为一种惯例,表示“您可以为此参数输入文件路径,但如果您输入 -,我们将读取 stdin”。 - Kenmore
显示剩余2条评论

31

这并不是魔法。有些命令将 - 解释为用户想要从标准输入读取或向标准输出写入;对于 Shell,它并没有什么特殊之处。


10
除非是使用cd -命令,否则bash(1)会将其处理为cd $OLDPWD的效果。 - sarnold
6
@sarnold,但关键点是相同的,“cd”——一个shell内置命令——本身解释连字符。没有“魔法” :-) - user166390
3
@pst,没问题,这并不神秘(它只是代码:),但对于shell来说确实有一些特殊之处。 - sarnold

20

- 意味着每个命令都有其特定的含义。有一些常见的约定,你在其他答案中也看到了大部分的例子,但它们没有一种是100%通用的。

对于shell来说,- 字符并没有什么神奇之处(除了shell本身和一些内置命令如cdecho以惯例的方式使用它)。像\'"这样的一些字符,在出现的任何地方都具有特殊的含义,它们被称为"shell元字符"。但-不是这样的。

要了解一个给定命令如何使用-,请阅读该命令的文档


1
天啊!我在 file 的文档中迷失了,然后发现了这个:要测试标准输入,请使用“-”作为文件名参数。你是100%正确的。谢谢。 - Eugene

8

这意味着使用程序的标准输入流。

对于cd命令来说,它有不同的含义:切换到先前的工作目录。


6

魔力在于惯例。几千年来,人们一直使用-作为前缀来区分选项和参数,并使用-作为文件名,以适当的方式表示stdin或stdout。不要低估惯例的力量!


不要高估人们从字面表达中辨别语言风格的能力。这种情况并没有持续千年。 - tripleee
3
@tripleee - 是的,但它已经持续了数十亿秒。;-) - David R Tribble
1
其实这已经持续了两千年:第二个和第三个世纪。 :) - ak2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接