Почему `sort <« $ f1 »` предпочтительнее `sort -« $ f1 »` и почему это предпочтительнее `sort« $ f1 »`?

Вероятно, кто-то использует ваш SMTP сервер для отправки почты, потому что его политика позволяет это.

У вас есть службы dovecot или courier , работающие на вашем сервере?

29
25.07.2018, 10:08
2 ответа
sort "$f1"

не работает для значений $f1, которые начинаются с -или здесь, для случая sort, некоторые из которых начинаются с +(, могут иметь серьезные последствия для файла с именем -o/etc/passwd, например ).

sort -- "$f1"

(где --сигнализирует об окончании опций )устраняет большинство этих проблем, но по-прежнему не работает для файла с именем -(, который sortвместо этого интерпретирует значение своего стандартного ввода ).

sort < "$f1"

Нет таких проблем.

Здесь оболочка открывает файл. Это также означает, что если файл не может быть открыт, вы также получите потенциально более полезное сообщение об ошибке (, например, большинство оболочек укажут номер строки в сценарии ), а сообщение об ошибке будет последовательным, если вы используете перенаправления, где это возможно, для открытия файлов.

И в

sort < "$f1" > out

(в отличие от sort -- "$f1" > out), если "$f1"не может быть открыт, outне будет создан/усечен и sortдаже не будет запущен.

Чтобы устранить некоторую возможную путаницу (после комментариев ниже ), это не мешает команде mmap()открывать файл или lseek()проникать внутрь него (, а не то, что sortделает либо )при условии, что сам файл доступен для поиска. Единственное отличие состоит в том, что файл открывается раньше и с файловым дескриптором 0 оболочкой, а не позже командой, возможно, с другим файловым дескриптором. Команда по-прежнему может искать/ммапить этот fd 0 по своему усмотрению. Это не следует путать с cat file | cmd, где на этот раз cmdstdin является конвейером, который нельзя преобразовать/поискать.

56
27.01.2020, 19:38

Проблема заключается в том, что имена файлов начинаются с дефиса. sort "$f1"не работает, если значение f1начинается с -, потому что команда интерпретирует это значение как опцию. Обычно это приводит к ошибке, но может даже вызвать брешь в безопасности . В sort -- "$f1", аргумент с двойным тире --означает «нет опций после этой точки» , поэтому значение f1не будет интерпретироваться как опция. Но есть еще один пограничный случай :, если значением f1является прочерк и ничего больше, то это не вариант, это аргумент -, что означает «стандартный ввод» (, потому что аргумент — входной файл; для выходного файла это будет означать «стандартный вывод» ).

Использование перенаправления позволяет избежать всех этих ловушек.

Это относится к большинству команд, а не только к sort.

18
27.01.2020, 19:38

Теги

Похожие вопросы