Tim*_*Tim 140 command-line shell utilities
对于命令,如果-用作参数代替文件名将意味着 STDIN 或 STDOUT。
但在这个例子中,它创建了一个名为 的文件-:
echo hello > -
Run Code Online (Sandbox Code Playgroud)
我怎样才能-在这个例子中表示 STDOUT?
相反,我怎么能在示例中-命名一个文件-,例如:
cat -
Run Code Online (Sandbox Code Playgroud)cam*_*amh 200
使用-的文件名平均标准输入/输出是一个惯例,很多程序使用。它不是文件名的特殊属性。内核不会识别-为特殊的,因此任何引用-为文件名的系统调用都将按-字面意思用作文件名。
使用 bash 重定向时,-不会将其识别为特殊文件名,因此 bash 将使用它作为文字文件名。
当cat将字符串-视为文件名时,它会将其视为 stdin 的同义词。要解决此问题,您需要更改所cat看到的字符串,使其仍然引用名为-. 执行此操作的通常方法是在文件名前加上路径 -./-或/home/Tim/-。例如,此技术还用于解决命令行选项与文件名冲突的类似问题,因此被称为 的文件./-e不会作为程序的-e命令行选项出现。
jll*_*gre 20
相反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代替。这些文件名应该可以在正常文件名可以使用的任何地方使用。
话虽如此,你的第一个例子有点愚蠢。任何会被重定向操作符捕获以写入文件的输出都已经是标准输出,因此重定向它并将其写回它的来源是没有用的。您在那里使用的行为是管道,而不是重定向:
echo hello |
Run Code Online (Sandbox Code Playgroud)在您的第二个示例中,您只需要给出一些指示,表明您想要一个具有该名称的文字文件,而不是它具有的内部别名。您可以通过像这样指定文件的路径来最简单地做到这一点:
cat ./-
Run Code Online (Sandbox Code Playgroud)