Являются ли именованный канал, созданный mknod, и FIFO, созданный mkfifo, эквивалентными?

Решение на вынос:

ls -pd !(*.jpg) | grep -Ev /$

Детали

Шаблон глобуса не опускается в подкаталоги -. lsделает :если вы передаете каталог в его командной строке, он отображает содержимое этого каталога.

Заменить lsнаecho:

$ echo !(*.jpg)

Или (почти )эквивалентное решение :говорит lsне спускаться в каталоги.

$ ls -d !(*.jpg)

Чтобы ответить на вопрос в комментариях :"как использовать команду ls для отображения только файлов, а не папок?" есть пара вариантов:

Краткий способ перечислить только каталоги:

echo */

Так что, возможно, ответ на список только файлов, а не каталогов может использоватьgrep -v

$ ls -p | grep -Ev /$

$ find. -maxdepth 1 ! -type d

Обратите внимание, что find будет перечислять точечные -файлы (скрытые файлы ). И find. -type dбудет (также )не переходить по символическим ссылкам.

Или прагматичный (posix )цикл:

$ for f in * ; do if [ -f "$f" ] ; then echo "$f" ; fi ; done

Конечно, конкретное решение для инвертированного расширения должно быть таким:

$ ls -pd !(*.jpg) | grep -Ev /$
11
111
112
1121
113
11a
11a1
1a1
1a2
1aa1.png
2a1
a.
a1a
a2a
aa
aa.gif
aa.png
aa.tiff
a.exe
a.gif
a.html
a.png
a.tiff
b2
b2a
ba.gif
ba.png
ba.tiff
b.html
cb1.png
d.gif

Примечание:

Опция -p вместе с grep позволяет идентифицировать каталоги,взгляните на справочную страницу ls:

-p, --file-type, --indicator-style=file-type

22
29.07.2019, 15:21
2 ответа

Да, это эквивалентно, но, очевидно, только если вы скажете mknodна самом деле создать FIFO, а не блочное или символьное устройство (, что редко делается в наши дни, как devtmpfs/udev делает это за вас ).

mkfifo foobar
# same difference
mknod foobar p

В straceодинаково для обеих команд:

mknod("foobar", S_IFIFO|0666)           = 0

Таким образом, с точки зрения системных вызовов, mkfifoна самом деле является сокращением для mknod.

Таким образом, самое большое различие заключается в семантике. С помощью mkfifoвы можете создать кучу FIFO за один раз:

mkfifo a b c

С mknod, так как вы должны указать тип, он всегда принимает только один аргумент:

# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p

В общем, mknodможет быть сложно правильно использовать. Поэтому, если вы хотите работать с FIFO, придерживайтесь mkfifo.

29
27.01.2020, 19:42

Они эквивалентны, за исключением крайних пределов переносимости. mknod... pизначально был единственным способом создания именованных каналов, но POSIX решил опустить его и изобрел вместо него mkfifo, по-видимому, потому, что именованные каналы по своей сути являются более переносимой концепцией, чем все другие вещи mknod, которые можно делать с устройствами и их старшие и младшие числа. Системный вызов mknodтакже был исключен из ранних версий POSIX.

Таким образом, для переносимости на древний UNIX mknod... pлучше. Для современных систем mkfifoнемного лучше, хотя маловероятно, что вы найдете настоящий современный Unix, в котором mknod... pне работает.

18
27.01.2020, 19:42

Теги

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