it-swarm.cn

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

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

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

    echo hello > -
    

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

  2. 相反,在以下示例中,如何使-表示名为-的文件:

    cat -
    
121
Tim

使用-作为文件名表示stdin/stdout是许多程序使用的约定。它不是文件名的特殊属性。内核无法识别-为特殊文件,因此任何以-为文件名的系统调用都将使用-作为文件名。

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

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

169
camh
  1. 您可以使用echo hello > -代替echo hello > /dev/stdout

    尽管“-”是每个要支持它的程序都必须实现的约定,但当操作系统(至少Solaris,Linux)支持/dev/stdin/dev/stdout/dev/stderr时,和BSD一样),独立于应用程序,然后将按您期望的方式工作。

18
jlliagre

提到的话-只是某些程序使用的命名约定。如果您想使用文件描述符引用这些流,Shell会识别出 jiliagre是正确的 ,因为您使用了名称/dev/stdin 要么 /dev/stdout代替。这些文件名应该在正常文件名可以工作的任何地方起作用。

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

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

    cat ./-
    
10
Caleb

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

6
bahamat

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

最好的方法是:

$ echo hello > /dev/fd/1

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

1
b3h3m0th

特殊字符主要有两个含义:

ASCII数字图表。

脚本或符号。

单个字符可能代表一个字符串,也可能充当一个字符串。以我的理解。

在C语言中,fopen()函数采用两个参数,第一个是文件流,第二个是打开文件的模式。模式是一个字符串。即使是单个字符。

cat>“-”作品。

0
Owais Qureshi