sort "$f1"
не відповідає значенням, $f1що починається з -або тут для випадку sortдеяких, які починаються з +(може мати серйозні наслідки для файлу, який називається, -o/etc/passwdнаприклад).
sort -- "$f1"
(де -- сигнали закінчуються параметрами) вирішує більшість цих проблем, але все-таки не вдається для файлу, який називається -(який sortінтерпретує замість нього stdin).
sort < "$f1"
Не має цих проблем.
Тут файл відкриває файл оболонки. Це також означає, що якщо файл неможливо відкрити, ви також отримаєте потенційно більш корисне повідомлення про помилку (наприклад, у більшості оболонок буде вказано номер рядка в сценарії), і повідомлення про помилку буде відповідне, якщо ви використовуєте де можливо, переадресації для відкриття файлів.
І в
sort < "$f1" > out
(всупереч sort -- "$f1" > out), якщо "$f1"їх не можна відкрити, outне буде створено / усічено і sortнавіть не буде запущено.
Щоб очистити певну можливу плутанину (наступні коментарі нижче), це не заважає команді інгібувати mmap()файл або lseek()входити всередину нього (не те, що sortце робить), за умови пошуку самого файлу. Єдина відмінність полягає в тому, що файл відкривається раніше, а в дескрипторі 0 файлом оболонкою, на відміну від команди, можливо, в іншому дескрипторі файлу. Команда все ще може шукати / mmap, що fd 0, як заманеться. Це не слід плутати з тим, cat file | cmdде cmdstdin цього разу - це труба, яку неможливо змінити / шукати.