可以使用 清除文件 。每次清除后,cat /dev/null > filename
它是否都是同一个特殊文件?cat > filename
答案1
最简洁的答案是不。
这是两种不同的技术清除文本文件使用cat /dev/null > file
andcat > file
后跟Ctrl+ C。
重定向>
用于将输出重定向到某个文件。例如,date
将显示当前时间和日期标准输出
$ date
Sat Jul 25 20:56:09 IST 2015
如果你使用,
$ date>/path/to/file
然后它将重定向stdout
到file
。
$ cat /path/to/file
Sat Jul 25 20:56:23 IST 2015
如何cat /dev/null>file
清除文件内容
它只是重定向空设备的内容/dev/null
到文件。因此内容将被覆盖,文件将变为空。
如何cat > file
清除文件内容
cat
将文件或标准输入连接到标准输出。以下是示例:
$ cat
some text # by user on stdin
some text # stdin to stdout concatenated by cat
some other text # by user on stdin
some other text # stdin to stdout concatenated by cat
^C # Ctrl+C to terminate.
该命令cat > file
将等待 stdin,并将重定向和覆盖文件。需要使用Ctrl+来停止它C。
如果您没有在 stdin 中输入任何内容并使用 SIGINT ( Ctrl+C
) 终止该进程,它将用空白覆盖该文件。
下面的例子可以更清楚地说明:
$ cat > file
some text
some other text
^C
$ cat file
some text
some other text
答案2
在任何一种情况下,没有任何特殊文件有任何有用的用途。
cat /dev/null
实际上是无操作的,这个命令根本没有任何意义,它可以被任何不输出任何内容的命令所取代。
例如,您可以使用以下任一命令清除文件的内容:
printf > filename
true > filename
: > filename
或者甚至对于许多 shell 来说,根本不使用任何命令,而是使用重定向:
> filename
另一方面:
cat > filename
重定向stdin
,即您在键盘上输入的所有内容到 filename。如果您在cat
输入任何内容之前中断命令,结果也将是一个空文件,但这是一种非常低效的方法。
答案3
不,清除文件的不是/dev/null
,而是>
重定向,它在重定向输出之前本质上会截断输出文件本身cat
。
cat /dev/null > filename
:您正在打开/dev/null
并打印其“内容”(无)到stdout
;同时filename
打开的文件描述符,文件被截断并且stdout
重定向cat
到它(因此实际上没有任何内容重定向到文件)cat > filename
:您没有打印任何内容到stdout
,因为您没有指定文件,甚至没有传递stdin
(这会导致cat
无限等待);同时filename
打开 的文件描述符,文件被截断并且被重定向到stdout
它cat
(因此实际上没有任何内容被重定向到文件)
它们做的事情完全相同(就清除文件而言),但第一个与第二个相比打开了一个额外的文件描述符,并且第二个将无限期地等待某些东西cat
进入stdin
。
与第一个方法等效的方法(与第二个方法的结果相同,但没有无限等待的麻烦cat
)是:
$ echo -n | cat > file # empty pipe
$ <emptyfile cat > file # empty file
$ <<<'' cat > file # empty herestring
$ <<EOF cat > file
>EOF # empty heredoc