Другий документ, який цитував Пітер Мортенсен у своєму коментарі до відповіді Кодесміта, зробив для мене речі набагато зрозумілішими. Цей документ написав windowsinspired.com. Посилання повторилося: Кращий спосіб зрозуміти цитування та уникнення аргументів командного рядка Windows .
Деякі подальші спроби та помилки призводять до наступних рекомендацій:
Уникайте кожної подвійної цитати "
за допомогою карети ^
. Якщо ви хочете , щоб інші символи зі спеціальним значенням для командної оболонки Windows , (наприклад, <
, >
, |
, &
) повинні інтерпретуватися як звичайні символи замість цього, то позбутися від них з кареткою, теж.
Якщо ви хочете, щоб ваша програма foo отримувала текст командного рядка "a\"b c" > d
і перенаправляла його вихід на файл out.txt , тоді запустіть програму, як випливає з командної оболонки Windows:
foo ^"a\^"b c^" ^> d > out.txt
Якщо foo інтерпретується \"
як буквальна подвійна цитата і очікує, що нескопічні подвійні лапки розмежуватимуть аргументи, що містять пробіл, тоді foo трактує команду як вказівку одного аргументу a"b c
, одного аргументу >
та одного аргументу d
.
Якщо замість foo трактується подвійна подвійна цитата ""
як буквальна подвійна цитата, тоді запустіть програму як
foo ^"a^"^"b c^" ^> d > out.txt
Ключове розуміння цитованого документа полягає в тому, що для оболонки команди Windows незмінна подвійна цитата викликає перехід між двома можливими станами.
Деякі подальші спроби та помилки означають, що в початковому стані перенаправлення (до файлу чи труби) розпізнається, а карета ^
уникає подвійної лапки, а карету вилучають із вводу. В іншому стані перенаправлення не розпізнається, і карета не уникає подвійної лапки і не видаляється. Давайте будемо називати ці стани відповідно «зовні» та «всередині».
Якщо ви хочете перенаправити висновок вашої команди, тоді оболонка команди повинна знаходитися у зовнішньому стані, коли вона досягне перенаправлення, тому перед переадресацією має бути парне число подвійних лапок (за допомогою карети). foo "a\"b " > out.txt
не працюватиме - командна оболонка передає цільну "a\"b " > out.txt
для взувши як його комбіновані аргументи командного рядка, замість передачі тільки "a\"b "
і перенаправляти висновок в out.txt .
foo "a\^"b " > out.txt
також не вийде, тому що карета ^
зустрічається у внутрішньому стані, де він є звичайним персонажем, а не символом втечі, тому "a\^"b " > out.txt
передається в foo .
Єдиний спосіб, який (сподіваємось) завжди працює, - це тримати командну оболонку завжди у зовнішньому стані, адже тоді перенаправлення працює.
Якщо вам не потрібно перенаправлення (або інші символи зі спеціальним значенням для оболонки команди), ви можете обійтися без уваги. Якщо foo трактується \"
як буквальна подвійна цитата, то ви можете назвати це як
foo "a\"b c"
Тоді foo отримує "a\"b c"
як об'єднаний текст аргументів і може інтерпретувати його як єдиний аргумент, рівний a"b c
.
Тепер - нарешті - до початкового питання. myscript '"test"'
виклик із командної оболонки Windows переходить '"test"'
до myscript . Мабуть, сценарій інтерпретує одиночні та подвійні лапки як розмежувачі аргументів та видаляє їх. Потрібно розібратися, який сценарій приймається як буквальна подвійна цитата, а потім вказати це у вашій команді, використовуючи ^
для втечі будь-які символи, що мають особливе значення для командної оболонки Windows. Зважаючи на те, що myscript
також доступно на Unix, можливо, \"
це і є фокус. Спробуйте
myscript \^"test\^"
або, якщо вам не потрібно перенаправлення,
myscript \"test\"
myscript \"test\"