使用破折号(-)代替文件名


110

对于命令,如果将其-用作参数来代替文件名,则表示STDIN或STDOUT。

  1. 但在此示例中,它将创建一个名称为的文件-

    echo hello > -

    -在此示例中,我如何表示STDOUT?

  2. 相反,我该如何使示例中-的文件命名-为:

    cat -

3
因为显然我必须有50个信誉才能直接评论...在/ dev / stdin / dev / stdout注释中,作为合法UNIX派生产品的AIX没有这些伪设备。而且,作为进一步说明,LINUX在任何情况下都不是UNIX派生产品。这是一种与POSIX兼容的工作方式,并且是目前最流行的UNIX-ish操作系统,但是请不要误会,这不是UNIX。但是,这里答复的要旨是正确的。shell不会将“-”符号解释为特殊符号,因此会将其作为ARG直接传递给每个单独的应用程序。如果应用程序无法识别

也有2>&-构造,意思是“关闭描述符2”。
user3132194

@ user95873,我想您想说的是:虽然Linux是Unix样的,但并不是每个类似Unix(或真正的UNIX)的都是Linux。Linux是不是真正的UNIX(即符合Single UNIX规范)的问题与/ dev / std {in,out,err}问题无关。在/ dev / std {in,out,err}中添加了功能,所以不丢失
sasha

Answers:


156

使用-的文件名是指标准输入/输出是很多程序使用的约定。它不是文件名的特殊属性。内核不会将其识别-为特殊字符,因此任何引用-为文件名的系统调用都将使用原义-作为文件名。

使用bash重定向时,-不会将其识别为特殊文件名,因此bash会将其用作文字文件名。

cat将字符串-视为文件名时,会将其视为stdin的同义词。要解决此问题,您需要更改显示的字符串cat,使其仍然引用名为的文件-。通常的做法是在文件名前添加路径- ./-/home/Tim/-。此技术还用于解决类似的问题,其中命令行选项与文件名冲突,因此,例如,被称为的文件./-e不会作为程序的-e命令行选项出现。


37
值得补充的是/dev/stdin,它/dev/stdout是通用的,可以代替-约定使用。
2011年

另外,在cat情况下,使用重定向不要列出参数可能会有帮助:cat <-; 但是,很难一次将多个文件串联在一起来进行混合和匹配。
2011年

10
@jmtd:/ dev / std {in,out}并非普遍可用。并非所有的Unix都有它。
卡姆(Camh)2011年

2
有趣的是,我认为它们是POSIX的一部分(但无法确认)。它们至少存在于Linux,BSD和Solaris上。您能举一个缺少它们的现代UNIX示例吗?
2011年

1
@camh不确定是否收到通知,这是一个非常非常古老的话题;我不确定是否可以,但是如果您知道问题的答案,我很好奇jmtd。:)
旋转

18
  1. 相反echo hello > -,您可以使用echo hello > /dev/stdout

    虽然“ - ”是必须由每个程序想要支持它,实现一个约定/dev/stdin/dev/stdout/dev/stderr有,当由OS(至少Solaris,Linux和BSD系统做)的支持,独立于应用程序,然后将工作作为你打算。


9

正如camh所述-仅仅是某些程序使用的命名约定。如果你想指与文件描述符的外壳会识别这些数据流,jiliagre是正确的有你使用名字/dev/stdin/dev/stdout代替。这些文件名应该在正常文件名可以工作的任何地方起作用。

  1. 话虽如此,您的第一个示例有点愚蠢。重定向运算符捕捉到的任何要写入文件的输出都已经是标准输出,因此重定向并将其写回到它的来源是没有用的。您在此处使用的行为是管道,而不是重定向:

    echo hello |
  2. 在第二个示例中,您只需要给出一些指示即可表明您想要一个同名的垃圾文件,而不是其内部别名。您可以通过如下指定文件路径来最简单地执行此操作:

    cat ./-

6

至于1,程序必须支持它。您不能随便使用它。至于2,请从(例如cat < -)重定向输入。


1

“-”方法存在很多问题。首先,它需要对“-”字符进行解释,许多程序不执行这种解释。此外,有些程序将连字符解释为标记命令行选项结束的定界符。编写程序时要使用文件名参数,“-”方法是一种hack,不错,但功能很弱。

最好的方法是:

$ echo hello > /dev/fd/1

/dev/stdout 是的符号链接 /dev/fd/1


重定向由外壳程序解释,而不是由正在调用的程序解释。
sherrellbc
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.