Доповнити існуючі корисні відповіді; наконечник капелюха до QZ Підтримка за те, щоб заохотити мене опублікувати окрему відповідь:
Тут грають два чіткі механізми :
(А) є чи cut
сам по собі вимагає роздільник (простору, в даному випадку) передається -d
можливості бути окремим аргументом або чи є це прийнятно , щоб додати його безпосередньо до -d
.
(b) як оболонка зазвичай аналізує аргументи, перш ніж передавати їх команді, що викликається.
(а) відповідає цитатою з керівних принципів POSIX щодо комунальних послуг (моє значення)
Якщо SYNOPSIS стандартної утиліти показує параметр із обов'язковим параметром-аргументом [...], відповідна програма використовує окремі аргументи для цього параметра та його аргумент-опціону . Однак відповідна реалізація також повинна дозволяти програмам вказувати параметр та параметр-аргумент у тому ж рядку аргументу без втручання символів .
Іншими словами: у цьому випадку, оскільки -d
параметр-аргумент опції є обов'язковим , ви можете вибрати, чи слід вказати роздільник як :
- (s) ВСІ: окремий аргумент
- (d) АБО: як значення, безпосередньо прикріплене до
-d
.
Після того як ви вибрали (-ла) або (г), важливий наступний рядковий-обчислювальний аналіз оболонки - (b) -
Еквівалентність пояснюється обробкою рядково-буквальної обробки оболонки :
Усі рішення, наведені вище, призводять до того самого рядка (у кожній групі) до моменту cut
їх бачення :
(s) : cut
бачить -d
, як власний аргумент, а потім окремий аргумент, який містить пробіл - без лапок чи \
префіксів !.
(d) : cut
бачить -d
плюс пробіл - без лапок і \
префіксів! - як частина того ж аргументу.
Причина форм у відповідних групах в кінцевому рахунку однакова, двояка, заснована на тому, як оболонка аналізує рядкові букви :
- Оболонка дозволяє визначати буквальне як через механізм, який називається цитуванням , який може приймати кілька форм :
- одноцитувані рядки: вміст всередині
'...'
сприймається буквально і утворює єдиний аргумент
- подвійне цитування рядків: вміст всередині
"..."
також утворює єдиний аргумент, але підлягає інтерполяції (розширює змінні посилання, такі як $var
підстановки команд ( $(...)
або `...`
) або арифметичні розширення ( $(( ... ))
).
\
-цитування окремих персонажів : \
попередній один символ спричиняє інтерпретацію цього символу як буквальний.
- Цитування доповнюється видаленням цитатою , а це значить , що після того , як оболонка розбирається в командному рядку, він видаляє ті лапки з аргументів (огороджувальних
'...'
або "..."
або \
примірників) - таким чином, команда викликається істота ніколи не бачить лапки .