-
作为参数代替文件名将表示STDIN或STDOUT。但是在此示例中,它将创建一个名称为
-
:echo hello > -
在此示例中,如何使
-
表示STDOUT?相反,如何使-
表示示例中名为-
的文件,例如:cat -
#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>“-”也可以。
评论
因为我显然必须有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}中添加了功能,所以不会丢失。