:>filename.txt 是做什么的?

Kah*_*ahn 23 shell bash rm

:>filename.txt
Run Code Online (Sandbox Code Playgroud)

例如:

root@box$ dd if=/dev/zero of=file.txt count=1024 bs=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00536175 s, 196 MB/s
root@box$ ll
total 1024
-rw-r--r-- 1 root root 1048576 Nov 15 14:40 file.txt
root@box$ :>file.txt
root@box$ ll
total 0
-rw-r--r-- 1 root root 0 Nov 15 14:40 file.txt
Run Code Online (Sandbox Code Playgroud)

这与rm?不同吗?它是否比其他类似的将文件归零或删除的方法运行得更快或更慢?

jes*_*e_b 38

正如您所发现的,这只是清空文件内容(它截断了文件);这是从不同rmrm实际上完全删除该文件。此外,如果文件不存在,:>file.txt将实际创建该文件。

:是一个“什么都不做的命令”,它将成功退出并且不产生任何输出,所以它只是一个清空文件的简短方法。在大多数 shell 中,您可以简单地执行>file.txt以获得相同的结果。它也可以是略微快于其它方法,例如echo >file.txtecho可能是外部命令。

此外,echo >file.txt将在使文件没有任何内容的file.txt位置放置一个空行:>file.txt

  • @Kusalananda `>filename.txt` 也是可移植的,参见 [Shell Grammar Rules](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_10_02)。它可能不适用于 zsh,但 zsh 既不是符合 POSIX 的 shell,也不是声称如此 (5认同)
  • 在`bash`中,据我在命令行上看到的,你甚至不必使用`:`来截断文件,`>filename.txt`似乎就足够了。`:>filename.txt` 是可移植的。 (4认同)
  • @oguzismail 在`zsh` 中,`>filename` 将充当`cat >filename`(除非例如`--emulate sh` 生效),这意味着你将剩下等待输入的shell。`:>filename` 仍然可以工作,所以这个结构是 _more_ 可移植的。 (2认同)
  • 好的,我明白了。*便携式*我的意思是与标准兼容,但我现在明白你的意思了 (2认同)
  • 如果文件不存在,它还会创建文件。 (2认同)

ste*_*eve 8

是的,它不同于rm

rm 将删除该文件。

:>filename.txt 清空文件,使其仍然存在,但大小为零字节。