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

Tim*_*Tim 140 command-line shell utilities

对于命令,如果-用作参数代替文件名将意味着 STDIN 或 STDOUT。

  1. 但在这个例子中,它创建了一个名为 的文件-

    echo hello > -
    
    Run Code Online (Sandbox Code Playgroud)

    我怎样才能-在这个例子中表示 STDOUT?

  2. 相反,我怎么能在示例中-命名一个文件-,例如:

    cat -
    
    Run Code Online (Sandbox Code Playgroud)

cam*_*amh 200

使用-的文件名平均标准输入/输出是一个惯例,很多程序使用。它不是文件名的特殊属性。内核不会识别-为特殊的,因此任何引用-为文件名的系统调用都将按-字面意思用作文件名。

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

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

  • 值得补充的是`/dev/stdin` 和`/dev/stdout` 是普遍可用的,可以用来代替`-` 约定。 (46认同)
  • @jmtd:/dev/std{in,out} 并非普遍可用。并非所有的 Unix 都有它。 (12认同)
  • 有趣的是,我认为它们是 POSIX 的一部分(但无法确认)。它们至少存在于 Linux、BSD 和 Solaris 上。你能举一个缺少它们的现代 UNIX 的例子吗? (2认同)
  • @jmtd 我似乎找到了这个问题的初步答案:http://unix.stackexchange.com/a/278368/31669 (2认同)

jll*_*gre 20

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

    虽然“-”是每个想要支持它的程序都必须实现的约定/dev/stdin/dev/stdout并且/dev/stderr当操作系统支持时(至少 Solaris、Linux 和 BSD 支持),独立于应用程序,然后将像您一样工作打算。


Cal*_*leb 12

正如camh 所提到的-只是一些程序使用的命名约定。如果您想使用 shell 将识别的文件描述符来引用这些流,jiliagre 是正确的,您可以使用该名称/dev/stdin/dev/stdout代替。这些文件名应该可以在正常文件名可以使用的任何地方使用。

  1. 话虽如此,你的第一个例子有点愚蠢。任何会被重定向操作符捕获以写入文件的输出都已经是标准输出,因此重定向它并将其写回它的来源是没有用的。您在那里使用的行为是管道,而不是重定向:

    echo hello |
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在您的第二个示例中,您只需要给出一些指示,表明您想要一个具有该名称的文字文件,而不是它具有的内部别名。您可以通过像这样指定文件的路径来最简单地做到这一点:

    cat ./-
    
    Run Code Online (Sandbox Code Playgroud)


bah*_*mat 6

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