Они эквивалентны, за исключением крайних пределов переносимости. mknod... p
изначально был единственным способом создания именованных каналов, но POSIX решил опустить его и изобрел вместо него mkfifo
, по-видимому, потому, что именованные каналы по своей сути являются более переносимой концепцией, чем все другие вещи mknod
, которые можно делать с устройствами и их старшие и младшие числа. Системный вызов mknod
также был исключен из ранних версий POSIX.
Таким образом, для переносимости на древний UNIX mknod... p
лучше. Для современных систем mkfifo
немного лучше, хотя маловероятно, что вы найдете настоящий современный Unix, в котором mknod... p
не работает.
Да, используйте eval, но вы должны вызвать выполнение командной строки.
eval $varName=$($varCmd)
А можно было...
declare cmd="$varName=$($varCmd)"
eval $cmd