Пакет: экранирование с помощью каретки

Я всегда ненавидел пакет, и я все еще делаю, даже для самых простых вещей, которые я предпочитаю C или PHP/Perl. Но на этот раз я не мог обойтись без него, **** вздох ****.

Я хотел перенаправить команду эха на другую команду. Например:

echo example | more

но я также хотел иметь возможность использовать специальные символы в эхо-части канала:

echo & | more

Что, конечно, не сработало. Поэтому я попробовал:

echo ^& | more

Это тоже не сработало. Затем методом проб и ошибок я обнаружил:

echo ^^^& | more

и это сработало. Но как заинтересовался программист, я задаюсь вопросом, почему. Почему ^& не работает и ^^^& сделал?

Ответ 1

Причина связана с тем, как Windows реализует трубы. Каждая сторона канала выполняется в собственной оболочке CMD. Ваша команда echo ^& | more на самом деле пытается выполнить

C:\Windows\system32\cmd.exe /S /D /c" echo & "

слева и

C:\Windows\system32\cmd.exe /S /D /c" more "

справа. Вы можете понять, почему левая сторона терпит неудачу, пытаясь повторить неэкранированный &. Побег был поглощен начальной фазой разбора до того, как будет выполнена действительная левая сторона.

Также легко понять, почему ваше решение работает. Левая сторона echo ^^^& | more становится

C:\Windows\system32\cmd.exe /S /D /c" echo ^& "

При работе с окнами Windows существует множество тонких осложнений. Обратитесь к Почему задержка с расширением заканчивается, если внутри блока кода с кодом? для получения дополнительной информации. У выбранного ответа есть лучшая информация, но я рекомендую прочитать вопрос и все ответы, чтобы получить контекст выбранного ответа.

Ответ 2

Первый ^ выходит из самого символа ^ (второй ^), а третий ^ ускоряет &.

Когда вы запускаете команду типа ECHO ^& | MORE, ^& заменяется на & оболочкой до того, как вывод будет отправлен на MORE.

Итак, когда вы запускаете ECHO ^^^& | MORE, оболочка заменяет ^^ на ^ и ^& на &, а затем выводит вывод на MORE.