В дополнение к существующим, полезные ответы; Подсказка к Поддержка QZ за то, что меня попросили опубликовать отдельный ответ:
В игру вступают два различных механизма :
(a) требует ли сам cut
разделитель (в данном случае пробел), передаваемый опции -d
, в качестве отдельного аргумента или допустимо добавить напрямую к -d
.
(b) как shell обычно анализирует аргументы перед передачей их вызываемой команде.
(a) отвечает цитатой из Руководства POSIX для утилит (выделено мной)
Если в синопсисе стандартной утилиты показана опция с обязательным аргументом-параметром [...], соответствующее приложение должно использовать отдельных аргументов для этой опции и его опция-аргумент . Однако , соответствующая реализация должна также разрешать приложениям указывать параметр и параметр-аргумент в одной и той же строке аргумента без промежуточных символов .
Другими словами: в этом случае , поскольку аргумент-параметр -d
является обязательным , , вы можете выбрать , указывать ли разделитель как :
- (s) ИЛИ: отдельный аргумент
- (d) ИЛИ: в качестве значения , непосредственно присоединенного к
-d
.
После того, как вы выбрали (ы) или (d), имеет значение shell для строкового литерала - (b) - что имеет значение:
При подходе (s) все следующие формы эквивалентны:
-d ' '
-d " "
-d \<space> # <space> used to represent an actual space for technical reasons
При подходе (d) , все следующие формы эквивалентны:
-d' '
-d" "
"-d "
'-d '
d\<space>
Эквивалентность объясняется строковой литеральной обработкой shell :
Все решения , приведенные выше, приводят к точно такой же строке (в каждой группе) к моменту, когда cut
видит их :
(s) : cut
видит -d
в качестве своего собственного аргумента, за которым следует отдельный аргумент, содержащий пробел char - без кавычек или \
префикс!.
(d) : cut
видит -d
плюс пробел - без кавычек или \
префикс! - как часть того же аргумента .
Причина, по которой формы в соответствующих группах в конечном итоге идентичны, двояка: как shell анализирует строковые литералы :
- Оболочка позволяет указывать литерал от как есть до механизм, называемый цитированием , который может принимать несколько форм :
- одиночные кавычки строки: содержимое
'...'
взято буквально и образует одиночный аргумент
- двойные кавычки строки: содержимое внутри
"..."
также формирует одиночный аргумент, но подвергается интерполяции (расширяет ссылки на переменные, такие как $var
, подстановки команд ($(...)
или `...`
) или арифметические разложения ($(( ... ))
).
\
-цитирование отдельных символов : \
, предшествующий одному символу, приводит к тому, что этот символ интерпретируется как литерал.
- Цитирование дополняется удалением кавычек , что означает, что после того, как оболочка проанализировала командную строку, она удаляет символов кавычек из аргументы (включая
'...'
или "..."
или \
экземпляров) - таким образом, вызываемая команда никогда не видит кавычки .