Работа с /dev/null с помощью cat или cp против touch

Работа с /dev/null с помощью cat или cp против touch

В руководстве оинфраструктура открытого ключаавтор создает базу данных для работы при настройкеКорневой центр сертификации:

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
  • Если у нас есть пустой каталог, есть ли разница между файлами foo, bar, или baz?
  • Имеет ли смысл cpиспользовать команду ing /dev/nullтолько для того, чтобы создать файл, который, как мы знаем, пуст?

решение1

Результатом всех этих действий является один и тот же пустой файл.

Можно было бы даже просто использовать >baz2. На мой взгляд, это немного элегантнее, так как не требует /dev/nullприсутствия и не требует вызова дополнительных команд/процессов.

Имейте в виду, что в отличие от touch, результатом >baz2будет пустой файл, даже если он baz2уже существует и имеет какой-то контент.

$ 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

Однако в учебных заметках и курсовых работах это может быть труднее читать, считаться опечаткой или чем-то подобным. Иногда лучше использовать более длинную командную строку :-)

Связанный контент