使用 cat 或 cp 与 touch 处理 /dev/null

使用 cat 或 cp 与 touch 处理 /dev/null

在关于的教程中公钥基础设施作者设置了一个数据库,以便在设置时使用根证书颁发机构

cp /dev/null ca/root-ca/db/root-ca.db
cp /dev/null ca/root-ca/db/root-ca.db.attr
echo 01 > ca/root-ca/db/root-ca.crt.srl
echo 01 > ca/root-ca/db/root-ca.crl.srl

我知道/dev/null这是一个特殊的文件,里面什么也没有,如果你echo进入它,也不会在任何地方打印。

看来这就是作者想要做的,所以我做了一个小例子来测试它:

$ ls
$ touch foo
$ cp /dev/null bar
$ cat /dev/null > baz
$ ls
bar baz foo
$ ls -l
total 0
-rw-r--r--  1 mbigras  1264914557  0 Apr 14 14:35 bar
-rw-r--r--  1 mbigras  1264914557  0 Apr 14 14:35 baz
-rw-r--r--  1 mbigras  1264914557  0 Apr 14 14:35 foo
  • 假设我们有一个空目录,文件foobar或之间有什么区别吗baz
  • cping from 的意义/dev/null只是为了建立一个我们知道是空的文件吗?

答案1

所有结果都会产生相同的空文件。

甚至可以只使用>baz2.我认为更优雅一点,因为它不依赖于/dev/null存在,并且不涉及调用额外的命令/进程。

请记住,与 不同的是,即使文件已经存在并且具有一些内容,touch结果也将是一个空文件。>baz2baz2

$ touch foo
$ cp /dev/null bar
$ cat /dev/null >baz
$ >baz2
$ ls -l
total 0
-rw-rw-r-- 1 ec2-user ec2-user 0 Apr 14 21:40 bar
-rw-rw-r-- 1 ec2-user ec2-user 0 Apr 14 21:40 baz
-rw-rw-r-- 1 ec2-user ec2-user 0 Apr 14 21:40 baz2
-rw-rw-r-- 1 ec2-user ec2-user 0 Apr 14 21:39 foo
$

答案2

区别在于如果文件已经存在并且有内容会发生什么:

例如,这是一个包含内容的文件:

$ ls -l ca/root-ca/db/root-ca.db
-rw-r--r-- 1 sweh sweh 6 Apr 14 18:06 ca/root-ca/db/root-ca.db
$ touch ca/root-ca/db/root-ca.db
$ ls -l ca/root-ca/db/root-ca.db       
-rw-r--r-- 1 sweh sweh 6 Apr 14 18:06 ca/root-ca/db/root-ca.db
$ cp /dev/null ca/root-ca/db/root-ca.db
$ ls -l ca/root-ca/db/root-ca.db       
-rw-r--r-- 1 sweh sweh 0 Apr 14 18:06 ca/root-ca/db/root-ca.db

我们可以看到该touch命令并没有清空文件,而是cp清空了文件。

现在,通常:可以使用该命令:

: > ca/root-ca/db/root-ca.db

例如

$ ls -l ca/root-ca/db/root-ca.db
-rw-r--r-- 1 sweh sweh 6 Apr 14 18:08 ca/root-ca/db/root-ca.db
$ : > ca/root-ca/db/root-ca.db  
$ ls -l ca/root-ca/db/root-ca.db
-rw-r--r-- 1 sweh sweh 0 Apr 14 18:08 ca/root-ca/db/root-ca.db

然而,在培训笔记和课程作业中,这可能更难阅读,被认为是拼写错误或类似情况。有时使用更长的命令字符串更好:-)

相关内容