我在另一个问题上看到了这段代码,但我无法对答案发表评论,所以我在这里问。
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
之前截断(不会截断输出文件,但如果它尚不存在,它会创建它)。tr
1<>
他也不能>>
使用
tr '\n' '\0' <file >>file
因为这会将输出附加到tr
文件末尾,而将旧数据保留在原处。