Почему в руководстве по rm говорится, что мы можем запустить его без каких-либо аргументов, если это не соответствует действительности?

Почему в руководстве по rm говорится, что мы можем запустить его без каких-либо аргументов, если это не соответствует действительности?

Мы видим, что синопсис rmкоманды таков:

rm [OPTION]... [FILE]...

Разве это не означает, что мы можем использовать только rmкоманду без каких-либо опций или аргументов?
Когда я запускаю команду rmотдельно, терминал затем показывает следующую ошибку:

rm: missing operand
Try 'rm --help' for more information.

Может ли кто-нибудь объяснить мне, почему это так?

решение1

rmУказан стандартный синопсис для утилитыв стандарте POSIX1&2 как

rm [-iRr] file...
rm -f [-iRr] [file...]

В первой форме требуется по крайней мере один файловый операнд, но во второй форме этого не требуется.

Работа rm -fбез файловых операндов не является ошибкой:

$ rm -f
$ echo "$?"
0

... но это не особо помогает.

Стандарт гласит, что для этого -fварианта rmкоммунальная служба должна...

Не запрашивать подтверждение. Не записывать диагностические сообщения и не изменять статус выхода в случае отсутствия файловых операндов или в случае несуществующих операндов. Любые предыдущие появления опции -iдолжны игнорироваться.

Это подтверждает, что запуск возможен rm -fбез каких-либо операндов имени пути и что это не приводит к rmвыходу с диагностическим сообщением или ненулевым статусом выхода.

Этот факт очень полезен в скрипте, который пытается удалить несколько файлов.

rm -f -- "$@"

где "$@"— список путей, которые могут быть пустыми или непустыми, или могут содержать несуществующие пути.

( rm -fвсе равно будет генерировать диагностическое сообщение и завершаться с ненулевым статусом выхода, если естьпроблемы с разрешением(Предотвращая удаление указанного файла.)

Однако запуск утилиты без операндов опций и путей приведет к ошибке:

$ rm
usage: rm [-dfiPRrv] file ...
$ echo "$?"
1

То же самое справедливо для GNU rm(выше показан OpenBSD rm) и других реализаций той же утилиты, но точное диагностическое сообщение и ненулевой статус выхода могут отличаться (например, в Solaris значение равно 2, а в macOS — 64).

В заключение следует отметить, что руководство GNU rmможет быть немного неточным, поскольку верно, что при наличии некоторых опций ( -f, которая является необязательной опцией) операнд имени пути является необязательным.


1 с издания 2016 года, после решенияэтот баг, видетьпредыдущее изданиедля справки.
2 POSIX — это стандарт, определяющий, что такое система Unix и как она себя ведет. Этот стандарт опубликованОткрытая Группа. См. также вопрос "Что такое POSIX?".

решение2

Технически синопсис правильный, но он запутанный. Есть случаи, когда имя файла не требуется:

rm --help
rm --version

(при использовании GNU rm). Во всех остальных случаях требуется имя файла.

Другие версии rmпоказывают файл как необязательный,напримервстраница руководства OpenBSD.

Более точный синопсис GNU rmпоказал бы три варианта:

rm[параметры...]файл...
rm --help
rm --version

Связанный контент