`cat <> file` 是如何工作的?

Qix*_*TED 47 shell bash io-redirection

cat < file文件的内容打印到标准输出。

cat > file读取 stdin 直到检测到Ctrl+D并将输入文本写入file

cat <> file,至少在我的 Bash 版本中,愉快地打印文件的内容(没有错误),但不修改文件,也不更新修改时间戳。

Bash 标准如何证明>第三条语句中看似被忽略的内容是正确的——更重要的是,它是否在做任何事情?

Mic*_*mer 51

Bash 用于<>创建读写文件描述符

重定向运算符

[n]<>word
Run Code Online (Sandbox Code Playgroud)

导致名称为 word 扩展的文件被打开,以便在文件描述符 n 上读取和写入,如果未指定 n,则在文件描述符 0 上打开。如果文件不存在,则创建它。

cat <> file打开file读写并将其绑定到描述符 0(标准输入)。它本质上等同< file于任何明智编写的程序,因为通常没有人可能尝试写入标准输入,但如果有人这样做,它就可以。

你可以写一个简单的C程序直接测试出来-write(0, "hello", 6)将写入hellofile通过标准输入。

<>应该在任何其他符合 POSIX 的 shell 中工作,具有相同的效果。

  • `&lt;&gt;` 在某些系统(如 Linux)上也很有用,可以在不阻塞的情况下打开命名管道,直到另一个进程打开它进行写入。 (6认同)
  • @Qix - 来自 [POSIX Rationale](http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap02.html) - `&lt;&gt;` 操作符在编写与多个终端一起工作的应用程序时可能很有用,偶尔想启动一个shell。反过来,该 shell 将无法运行从普通控制终端运行的应用程序,除非它可以使用 `&lt;&gt;` ... 例如 ... 寻呼机 `more`,它从标准错误中读取以获取其命令,因此标准输入和标准输出都可用于其通常用途。`猫食| 更多-&gt;/dev/tty03 2&lt;&gt;/dev/tty03` (4认同)
  • 副手,我想不出任何好的。给出一个明确的描述符(`4&lt;&gt;file`)很有用,我认为 0 和任何省略它时的默认值一样好。从标准输出读取也好不到哪里去。 (3认同)

Sté*_*las 46

<> file<读+写模式打开文件(默认情况下在文件描述符 0 (stdin) 上,例如),而不会截断如果事先不存在则创建文件

这对应于O_RDWR|O_CREAT传递给open()系统调用的标志。相比之下<O_RDONLY>O_WRONLY|O_CREAT|O_TRUNC>> O_WRONLY|O_CREAT|O_APPEND

由于应用程序通常不会写入其标准输入,因此标准输入可写通常并不有用。应用程序通常不希望读取写入它们在启动时收到的文件描述符;他们通常从 stdin(或他们自己打开的文件描述符)读取并写入 stdout 或 stderr(或他们自己打开的文件描述符)。

<> 可以有它的用途:

  • 您可能喜欢cat <> filecat < file,如果你不希望命令,如果失败,file不存在,但空的file创建来代替。
  • 的非截断方面<>使得在适当位置覆盖文件非常有用。但是,在这种情况下,您通常不会在文件描述符 0 上使用它:

    printf xxx 1<> file
    
    Run Code Online (Sandbox Code Playgroud)

    取代了前3个字节的filexxx

  • 在 Linux<>等某些系统上,在命名管道 (FIFO) 上打开命名管道而不会阻塞(无需等待其他进程打开另一端),并确保管道结构保持活动状态。例如在:

    mkfifo pipe; sed 's/foo/bar/g' <> pipe
    
    Run Code Online (Sandbox Code Playgroud)

    sed处理来自写入它的任意数量的其他进程的传入数据,并且永远不会看到eof.

  • 请注意,在 AT&amp;T ksh93 上,`&lt;&gt;` 默认为 `1&lt;&gt;`(stdout)而不是 `0&lt;&gt;`(stdin)。这是我报告的 POSIX 合规性错误,将在下一个版本中修复。https://github.com/att/ast/issues/75 但是在当前的 ksh93 版本不再使用之前,您必须包含文件描述符编号才能可移植地使用 `&lt;&gt;`。 (2认同)