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



但是在此示例中,它将创建一个名称为-

echo hello > -


在此示例中,如何使-表示STDOUT?相反,如何使-表示示例中名为-的文件,例如:

cat -




评论

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

还有2>&-构造,表示“关闭描述符2”。

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

#1 楼

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

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

评论


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

– jmtd
2011年7月22日9:00

@jmtd:/ dev / std {in,out}并非普遍可用。并非所有的Unix都有它。

– camh
2011年7月22日在10:37

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

– jmtd
2011年8月2日,晚上8:51

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

–旋转
16年11月23日在6:29

@jmtd我似乎找到了对该问题的初步答案:unix.stackexchange.com/a/278368/31669

–旋转
16年11月23日在6:35

#2 楼



可以使用echo hello > -代替echo hello > /dev/stdout

虽然'-'是每个想要支持它的程序都必须实现的约定,但它们都支持/dev/stdin/dev/stdout/dev/stderr当受到OS支持时(至少是Solaris,Linux和BSD支持),它们独立于应用程序,然后将按您的预期工作。

#3 楼

正如camh所述,-只是某些程序使用的命名约定。如果要使用外壳程序可以识别的文件描述符引用这些流,则jiliagre是正确的,因为您改用名称/dev/stdin/dev/stdout。这些文件名应该在普通文件名可以工作的任何地方都可以工作。这么说,您的第一个示例有点傻。重定向运算符捕获到的任何要写入文件的输出都已经是标准输出,因此重定向并将其写回到其来源是没有用的。您在此处使用的行为是管道,而不是重定向:

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

cat ./-




#4 楼

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

#5 楼

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

评论


重定向由外壳程序解释,而不是由正在调用的程序解释。

– sherrellbc
17年1月3日于13:46

#6 楼

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

ASCII数字图表。
脚本或符号。 。以我的理解。
用C语言fopen()函数需要两个参数,第一个是文件流,第二个是打开文件的模式。模式是一个字符串。即使是单个字符。
cat>“-”也可以。