Да, это эквивалентно, но, очевидно, только если вы скажете 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
.
Я отформатировал ваш вопрос, включая ваш псевдокод, но способ, которым вы пытаетесь это сделать, не сработает. Ваша переменная $names
не является массивом, а представляет собой одну длинную строку с включенными разрывами строк. Вот как вы можете перебирать такую строку в будущем.
Это наш образец names.txt
файла, который мы будем использовать для имитации процесса
### names.txt ###
### our sample file to grep over as an example ###
##################################################
Abc xyz
Pqr def
Lmn ghi
со следующим кодом:
names=$(grep -v '^#' names.txt)
i=1;
while read n; do
echo "Name $i. $n"
if [[ "$n" == "Pqr def" ]]; then
echo "--- $n was found at line $i"
fi
i=$(($i+1));
done <<< "$names"
Ваш вывод будет выглядеть так:
Name 1. Abc xyz
Name 2. Pqr def
--- Pqr def was found on line 2
Name 3. Lmn ghi