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
де cmd
stdin цього разу - це труба, яку неможливо змінити / шукати.