Почему созданные каталоги исчезают после перезагрузки в /dev?

На самом деле имеется дваwэлемента. Один — команда, другой — флаг s///.

Оба используются для записи текущего пространства шаблонов в файл.

команда

Например, эта команда wзапишет вoutfile(сделать копию):

$ printf '%s\n' AA BB CC DD EE > infile
$ sed -n 'w outfile' infile
$ cat outfile
AA
BB
CC
DD
EE

Опция -nпозволяет избежать печати любого пространства шаблона, но команда wбудет writeкаждый шаблон (строку )указывать на имя файла в аргументе после команды w(, которая должна завершить команду ).

Это, вместо этого, напишет только одну строку (строку, которая имеет (по крайней мере )одинC):

$ sed -n '/C/ w outfile' infile ;  cat outfile
CC

флаг

Другой элемент w— это флаг wдля команды s///, который хотя и означает примерно то же самое write, но выполняется только в том случае, если подстановка в команде s///была выполнена:

$ sed -n 's/C/X/w outfile' infile; cat outfile
XC

Q1

But where do I put the w substitution flag if I'm using multiple commands and want the results wrote to a file?

Поскольку флаг подстановки связан с одной (конкретной )заменой, где его следует использовать, зависит от того, какую замену необходимо записать:

$ sed -n -e 's/B/X/w outfile' -e 's/D/Y/' infile; cat outfile
XB

Обратите внимание, что каждая замена должна быть в отдельной-e(или отдельной строке ), так как имя выходного файла должно заканчиваться командой (требуется новая строка ),или может быть записано как:

$ sed -n -e 's/B/X/w outfile
> s/D/Y/' infile; cat outfile
XB

Другая замена может быть выбрана с помощью:

$ sed -n -e 's/B/X/' -e 's/D/Y/w outfile' infile; cat outfile
YD

Или оба:

$ sed -n -e 's/B/X/w outfile' -e 's/D/Y/w outfile' infile; cat outfile
XB
YD

Или используйте команду w(без флага)(и предполагая, что GNU sed):

$ sed -n 's/B/X/;s/D/Y/;w outfile' infile; cat outfile
AA
XB
CC
YD
EE

Q2

I want to write the whole output to the file, a copy of the original with the changes made.

Флаг подстановки не может записать весь файл, если замена не происходит для всех строк. Вам нужно использовать команду w(, предполагая, что bash):

$ printf 'The quick brown fox jumps over the lazy dog%.0s\n' {1..14} >catAndDog.txt
$ sed -n '4 { s/fox/elephant/ ; s/dog/cat/ } ; w outfile' catAndDog.txt
$ cat outfile
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown elephant jumps over the lazy cat
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog

Поймите, что флаг wдля каждой замены будет печатать строку для каждой замены, так что это произойдет:

$ sed -n -e '4 { s/fox/elephant/w outfile' -e 's/dog/cat/w outfile' -e '}' catAndDog.txt
$ cat outfile
The quick brown elephant jumps over the lazy dog
The quick brown elephant jumps over the lazy cat
4
26.12.2020, 11:23
1 ответ

Да, вы можете создавать файлы и/или каталоги в /dev/. Но вы не можете ожидать, что они все еще будут там после перезагрузки.

Вот почему :файловая система devотвечает за доступ к устройству. Это не блочная файловая система (с базовой «реальной» памятью ), а файловая система на основе памяти -. Поскольку он существует только в ОЗУ, все под /dev/стирается при завершении работы и воссоздается при загрузке.

Население /dev/может быть выполнено тремя способами:

  • статически (в настоящее время очень редко)
  • на уровне пользовательского пространства с помощью программного обеспечения udev
  • на уровне ядра, используя devtmpfs.

Вот несколько ссылок на отличные посты с подробным описанием этого:

25
18.03.2021, 22:40

Теги

Похожие вопросы