Правильно, ls `mktemp` создаёт файл и показывает его.
Если файл создан, то потом можно сделать echo $p > $t
А при ls `mktemp -u` мы получаем имя файла, которого точно пока ещё нет. И ls <это_имя> говорит, что файла нет.
НО! Во втором случае после выполнения mktemp -u, но до выполнения ls кто-то другой случайно может создать файл с таким именем и записать туда что-то нужное. Получится один файл на два процесса, один процесс будет туда что-то писать, а другой будет это перезаписывать.
Вероятность очень мала, но не 0.
Случится в самый неподходящий момент.