
Мы видим, что синопсис 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