使用 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

然而,在培訓筆記和課程作業中,這可能更難閱讀,被認為是拼字錯誤或類似情況。有時使用更長的命令字串更好:-)

相關內容