命令行参数中" - "(破折号)的神奇之处是什么?

che*_*ila 90 unix linux bash shell command-line

例子:

  • 创建ISO映像并将其直接刻录到CD.

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

  • 切换到上一个目录.

    cd -

  • 收听端口12345并发送给它的解压数据.

    nc -l -p 12345 | tar xvzf -

破折号的目的是什么,我该如何使用它?

pax*_*blo 100

如果你的意思是命令-结束时裸体tar,这在许多想要使用文件的命令上很常见.

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

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

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

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

  • 请注意,您也可以使用`-`进行git分支,即您可以使用`git checkout -`切换回以前的分支. (6认同)
  • tar文档中的哪个部分解释了它是否受支持?我怎么知道哪些命令支持它? (3认同)
  • 如果某个命令的“-”有特殊含义,您可以在手册页中找到其解释。 (2认同)

Ign*_*ams 17

这不是魔术.某些命令解释-为用户想要从stdin读取或写入stdout; shell没有什么特别之处.

  • 除了`cd -`; `bash(1)`处理`cd -`就像你写了'cd $ OLDPWD`一样. (9认同)
  • @sarnold但问题是相同的,`cd` - 一个shell内置命令 - 解释一个破折号本身.没有"魔术":-) (5认同)
  • @pst,当然,没有任何魔力(全都是代码:),但是在外壳上有一些特别之处。 (2认同)
  • @sarnold你赢了:-) (2认同)

Ry-*_*Ry- 12

从或向stdin或重定向stdout.

请参阅:http://tldp.org/LDP/abs/html/special-chars.html#DASHREF2


Wil*_*ell 7

魔术在大会中.几千年来,人们使用' - '来区分选项和参数,并在文件名中使用' - '来表示stdin或stdout,视情况而定.不要低估惯例的力量!

  • @tripleee - 确实如此,但它已经持续了数十亿秒。;-) (3认同)
  • 事实上它已经持续了两千年:第二个和第三个。:) (2认同)

Kei*_*son 7

-意味着每个命令想要它的意思.有几个常见的约定,你已经在其他答案中看到了大多数的例子,但没有一个是100%普遍的.

没有什么魔术有关-的字符至于外壳而言(除了外壳本身,有的像其内置的命令cd,并echo使用它在传统的方式).有些人物,比如\,'",都是 "神奇的",无论出现在哪里都有特殊含义.这些是"shell元字符". -不是那样的.

要查看给定命令的使用方式-,请阅读该命令的文档.


Bri*_*ain 5

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

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