Arbeiten mit /dev/null mit cat oder cp vs touch

Arbeiten mit /dev/null mit cat oder cp vs touch

In einem Tutorial überPublic-Key-InfrastrukturDer Autor richtet eine Datenbank ein, mit der er beim Einrichten einesStammzertifizierungsstelle:

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

Ich weiß, /dev/nulldass es sich um eine spezielle Datei handelt, die nichts enthält und nirgendwo ausgedruckt wird, wenn Sie echosie öffnen.

Es scheint, als ob der Autor genau das versucht, deshalb habe ich zum Testen ein kleines Beispiel erstellt:

$ 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
  • Angenommen, wir haben ein leeres Verzeichnis, gibt es irgendeinen Unterschied zwischen den Dateien foo, bar, oder baz?
  • Besteht der Sinn von cping from /dev/nulllediglich darin, eine Datei einzurichten, von der wir wissen, dass sie leer ist?

Antwort1

Das Ergebnis ist alles dieselbe leere Datei.

Könnte sogar einfach verwenden >baz2. Meiner Meinung nach etwas eleganter, da es nicht auf /dev/nulldie Anwesenheit angewiesen ist und keine zusätzlichen Befehle/Prozesse aufgerufen werden müssen.

Bedenken Sie touch, dass im Gegensatz zu das Ergebnis von >baz2eine leere Datei ist, auch wenn baz2es bereits vorhanden ist und Inhalt hat.

$ 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
$

Antwort2

Der Unterschied besteht darin, was passiert, wenn die Datei bereits vorhanden ist und Inhalt hat:

Hier ist beispielsweise eine Datei mit Inhalt:

$ 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

Wir können sehen, dass der touchBefehl die Datei nicht geleert hat, aber das cphat er getan.

Normalerweise :kann stattdessen der folgende Befehl verwendet werden:

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

z.B

$ 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

In Schulungsunterlagen und Kursarbeiten kann dies jedoch schwerer zu lesen sein, es könnte ein Tippfehler oder Ähnliches sein. Manchmal ist es besser, eine längere Befehlszeichenfolge zu verwenden :-)

verwandte Informationen