Дополнять существующие полезные ответы; подсказка к QZ Поддержка за то, что я рекомендую опубликовать отдельный ответ:
Здесь действуют два разных механизма :
(а) является ли cut сам по себе требует разделителя (пространства, в данном случае) передается -dвозможности быть отдельным аргументом или является ли это приемлемо , чтобы добавить его непосредственно к -d.
(б) как оболочка обычно анализирует аргументы перед передачей их вызываемой команде.
(а) отвечает цитата из руководств POSIX для коммунальных услуг (выделено мое)
Если в ОПИСАНИИ стандартной утилиты показан параметр с обязательным аргументом option [...], то соответствующее приложение должно использовать отдельные аргументы для этого параметра и его аргумента option . Однако соответствующая реализация также должна позволять приложениям указывать параметр и параметр-аргумент в одной строке аргумента без промежуточных символов .
Другими словами: в этом случае, поскольку -dпараметр-аргумент является обязательным , вы можете выбрать , указывать ли разделитель следующим образом :
- (s) ИЛИ: отдельный аргумент
- (d) ИЛИ: как значение, непосредственно связанное с
-d .
После того, как вы выбрали (s) или (d), именно строковый литеральный синтаксический анализ оболочки - (b) - имеет значение:
Эквивалентность объясняется оболочкой строковой литеральной обработкой :
Все приведенные выше решения приводят к появлению точно такой же строки (в каждой группе) к тому времени, когда cutони их увидят :
(s) : cutвидит в -dкачестве своего собственного аргумента отдельный аргумент, содержащий пробел - без кавычек или \префиксов !.
(d) : cutвидит -d плюс пробел - без кавычек или \префиксов! - как часть того же аргумента.
Причина, по которой формы в соответствующих группах в конечном итоге идентичны, двояка, в зависимости от того, как оболочка анализирует строковые литералы :
- Оболочка позволяет указывать литерал как есть через механизм, называемый цитированием , который может принимать несколько форм :
- строки в одинарных кавычках : содержимое внутри
'...'воспринимается буквально и образует единый аргумент
- строки в двойных кавычках : содержимое внутри
"..."также формирует один аргумент, но подвергается интерполяции (расширяет ссылки на переменные, такие как $varподстановки команд ( $(...)или `...`) или арифметические расширения ( $(( ... ))).
\-цитирование отдельных символов : \предшествующий одному символу этот символ интерпретируется как литерал.
- Цитирование дополняется удалением кавычек , что означает, что после того, как оболочка проанализировала командную строку, она удаляет символы кавычек из аргументов (включающие
'...'или "..."или \экземпляры) - таким образом, вызываемая команда никогда не видит символы кавычек .