对于命令,如果将其-
用作参数来代替文件名,则表示STDIN或STDOUT。
但在此示例中,它将创建一个名称为的文件
-
:echo hello > -
-
在此示例中,我如何表示STDOUT?相反,我该如何使示例中
-
的文件命名-
为:cat -
2>&-
构造,意思是“关闭描述符2”。
对于命令,如果将其-
用作参数来代替文件名,则表示STDIN或STDOUT。
但在此示例中,它将创建一个名称为的文件-
:
echo hello > -
-
在此示例中,我如何表示STDOUT?
相反,我该如何使示例中-
的文件命名-
为:
cat -
2>&-
构造,意思是“关闭描述符2”。
Answers:
使用-
的文件名是指标准输入/输出是很多程序使用的约定。它不是文件名的特殊属性。内核不会将其识别-
为特殊字符,因此任何引用-
为文件名的系统调用都将使用原义-
作为文件名。
使用bash重定向时,-
不会将其识别为特殊文件名,因此bash会将其用作文字文件名。
当cat
将字符串-
视为文件名时,会将其视为stdin的同义词。要解决此问题,您需要更改显示的字符串cat
,使其仍然引用名为的文件-
。通常的做法是在文件名前添加路径- ./-
或/home/Tim/-
。此技术还用于解决类似的问题,其中命令行选项与文件名冲突,因此,例如,被称为的文件./-e
不会作为程序的-e
命令行选项出现。
/dev/stdin
,它/dev/stdout
是通用的,可以代替-
约定使用。
cat
情况下,使用重定向不要列出参数可能会有帮助:cat <-
; 但是,很难一次将多个文件串联在一起来进行混合和匹配。
jmtd
。:)
正如camh所述,-
仅仅是某些程序使用的命名约定。如果你想指与文件描述符的外壳会识别这些数据流,jiliagre是正确的有你使用名字/dev/stdin
或/dev/stdout
代替。这些文件名应该在正常文件名可以工作的任何地方起作用。
话虽如此,您的第一个示例有点愚蠢。重定向运算符捕捉到的任何要写入文件的输出都已经是标准输出,因此重定向并将其写回到它的来源是没有用的。您在此处使用的行为是管道,而不是重定向:
echo hello |
在第二个示例中,您只需要给出一些指示即可表明您想要一个同名的垃圾文件,而不是其内部别名。您可以通过如下指定文件路径来最简单地执行此操作:
cat ./-
“-”方法存在很多问题。首先,它需要对“-”字符进行解释,许多程序不执行这种解释。此外,有些程序将连字符解释为标记命令行选项结束的定界符。编写程序时要使用文件名参数,“-”方法是一种hack,不错,但功能很弱。
最好的方法是:
$ echo hello > /dev/fd/1
/dev/stdout
是的符号链接 /dev/fd/1