“1file”shell 输入/输出重定向如何工作?

“1file”shell 输入/输出重定向如何工作?

我在另一个问题上看到了这段代码,但我无法对答案发表评论,所以我在这里问。

tr '\n' '\0' < file 1<> file

我对这1<>部分很感兴趣,以前从未见过,而且我在谷歌上找不到任何有用的东西。

答案1

这是在一个答案中斯蒂芬·查泽拉斯写道。这是POSIX shell 功能并且不特定于bash.它将在您的 shell 手册中提及,以及其他重定向操作符的描述。

打开标准输出,文件描述符 1,用于读取和写入,并将其附加到当前目录中1<>file指定的文件。file

在此之前,他已经附加了同一文件中的标准输入。

tr然后将从其标准输入 from 读取file,并将所有换行符更改为 nul 字符。的输出tr被写回同一个文件。

只要tr命令的结果与 中的原始数据一样长,此操作就有效file

如果结果tr比原始文件短,则文件末尾将出现“旧数据”:

$ cat file
too many @ here: @@@@
the end
$ tr -s '@' <file 1<>file
$ cat file
too many @ here: @
the end
nd

请注意,他不能>使用

tr '\n' '\0' <file >file

因为这会在有机会读取file之前截断(不会截断输出文件,但如果它尚不存在,它会创建它)。tr1<>

他也不能>>使用

tr '\n' '\0' <file >>file

因为这会将输出附加到tr文件末尾,而将旧数据保留在原处。

相关内容