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