通过 cat > filename 清除文件

通过 cat > filename 清除文件

可以使用 清除文件 。每次清除后,cat /dev/null > filename它是否都是同一个特殊文件?cat > filename

答案1

最简洁的答案是不。

这是两种不同的技术清除文本文件使用cat /dev/null > fileand
cat > file后跟Ctrl+ C

重定向>用于将输出重定向到某个文件。例如,date将显示当前时间和日期标准输出

$ date
Sat Jul 25 20:56:09 IST 2015

如果你使用,

$ date>/path/to/file

然后它将重定向stdoutfile

$ 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打开 的文件描述符,文件被截断并且被重定向到stdoutcat(因此实际上没有任何内容被重定向到文件)

它们做的事情完全相同(就清除文件而言),但第一个与第二个相比打开了一个额外的文件描述符,并且第二个将无限期地等待某些东西cat进入stdin

与第一个方法等效的方法(与第二个方法的结果相同,但没有无限等待的麻烦cat)是:

$ echo -n | cat > file # empty pipe
$ <emptyfile cat > file # empty file
$ <<<'' cat > file # empty herestring
$ <<EOF cat > file
>EOF # empty heredoc

相关内容