命令行参数中的“-”(破折号)有什么魔力?


101

例子:

  • 创建一个ISO映像并将其直接刻录到CD。

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

  • 转到上一个目录。

    cd -

  • 侦听端口12345并解压缩发送给它的数据。

    nc -l -p 12345 | tar xvzf -

破折号的目的是什么?如何使用?

Answers:


111

如果您的意思是赤裸裸-tar命令,这在许多要使用文件命令中很常见。

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

您的第一个和第三个示例就是这种情况。例如,该cdrecord命令采用标准输入(由产生的ISO图像流mkisofs)并将其直接写入/dev/dvdrw

使用该cd命令,每次更改目录时,它都会存储您来自的目录。如果cd使用特殊的-“目录名称”,它将使用该记住的目录而不是真实目录。通过使用它,您可以轻松快速地在两个目录之间切换。

其他命令可以-视为不同的特殊值。


9
注意,您也可以-用于git分支,即,您可以使用git checkout -
snappieT 2014年

3
它在tar文档中的何处说明受支持吗?我怎么知道哪些命令支持它?

1
如果命令具有的特殊含义-,则可以在手册页中找到其说明。
codeforester

su-#

我发现这样的命令很好奇:tar -cvf-/ home | aescrypt -e -p apples-> backup_files.tar.aes实际上是tar -cvf-/ home | aescrypt -e -p apples -o backup_files.tar.aes-因为管道字符| 应该不需要最后一个破折号。但是如果没有最后一个破折号,该命令将失败。听起来不合逻辑。有人可以给我参考一下,其中解释了命令行中的破折号。我找不到。
elmclose

22

这不是魔术。有些命令解释-为用户要从stdin读取还是要写入stdout。外壳没有什么特别的。


9
除情况外cd -; bash(1)手柄cd -,如果你写了cd $OLDPWD
sarnold

6
@sarnold但是要点是一样的-shell cd内置命令-解释破折号本身。没有“魔术” :-)

2
@pst,当然,没有神奇的(这一切都只是代码:),但有什么特别的它的外壳。
sarnold


9

-确切地表示每个命令要表达的意思。有几种常见的约定,您已经在其他答案中看到了其中大多数的示例,但是它们都不是100%通用的。

-就外壳而言,关于字符没有什么神奇的东西(除了外壳本身及其一些内置命令(如cdecho)以常规方式使用)。某些字符(如\,,'" “神奇的”,无论它们出现在何处都具有特殊含义。这些是“外壳元字符”。 -不是那样的。

要查看给定命令的用法-,请阅读该命令的文档


7

魔术是惯例。几千年来,人们一直使用“-”将选项与参数区分开,并在文件名中使用“-”来表示标准输入或标准输出。不要小看约定的力量!


不要高估人们从文字表达中辨别言语举止的能力。几千年来一直没有发生这种情况。
三人

1
@tripleee-是的,但是已经持续了数十亿秒。;-)
David R Tribble

5

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

对于cd,它的含义有所不同:转到先前的工作目录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.