Стандартная команда оболочки для Windows - cmd.exe - не использует оператор << на всех.¹
Один < означает "читать файл в стандартный ввод " для cmd.exe , но два < символа подряд для бессмысленного для cmd.exe , поэтому он выдает ошибку, которую вы получили.
Оператор << имеет смысл для всех основных типов командной оболочки Unix, где он используется для здесь-документов:²
$ some-command <<END
blah blah blah
blah blah
blah blah blah blah blah
END
Эти три строки отправляются some-command на ее стандартный ввод.
Это полезно для отправки большого количества текста в команду без предварительной записи в файл, как это было бы с оператором < . Я часто использую его для встраивания сообщения об использовании в скрипт:
#!/bin/sh
if [ -z "$1" ]
then
cat <<USAGE
usage: myscript <files...>
Grobbles the foobie for all files given on the command line.
USAGE
exit 1
fi
# ... do something with command line arguments
Это лучше, чем написать кучу echo операторов, поскольку текст heredoc отформатирован точно так, как он выводится на экран. Кроме того, в этом контексте легче иметь дело с пробелами, цитированием, перенаправлением и интерполяцией переменных. Обратите внимание, например, на то, что я использовал угловые скобки в сообщении об использовании без необходимости делать что-то умное, чтобы оболочка не пыталась использовать их для перенаправления ввода / вывода.
Если вы хотите делать такие вещи в Windows, вы можете установить Cygwin и использовать один из его оболочек. Если вы используете Windows 10, вы можете использовать WSL .
Примечания:
Эта ссылка идет в архивированное дерево документации Windows XP. Microsoft разорвала ссылку, которую я использовал ранее, когда они заархивировали эти документы, поэтому в случае, если они разорвут ее, вот резервная ссылка на стороннюю версию.
Единственный другой справочный материал по cmd.exe я знаю на microsoft.com, - это PDF-файл команд Windows (4,9 МБ, 948 страниц), в котором содержится справка для большинства (!) из встроенных и предоставляемых Microsoft внешних команд, которые вы можете дать в командной строке cmd . Этот PDF неполный по двум причинам. Во-первых, что наиболее актуально, здесь нет совместного обсуждения того, как перенаправление работает в оболочке cmd.exe ; нет даже обсуждения грамматики оболочки. Во-вторых, список команд PDF неполный: первое, что мне пришлось проверить, не покрыто: diskpart .
Я полагаю, что все это следует из явных попыток Microsoft заменить cmd.exe на PowerShell, которые продолжаются уже много лет. В последнем обновлении Windows 10 на момент написания этой статьи они предприняли дальнейшие шаги, чтобы скрыть существование cmd.exe, хотя он еще не полностью исчез.
Стоит отметить, что PowerShell также не поддерживает оператор перенаправления << . Также - в печальной регрессии из оболочек Unix и cmd.exe - он не поддерживает < перенаправление!
Канонический способ начать здесь-документ, как я уже писал выше, без пробела между << и словом разделителя. Мое неясное воспоминание состоит в том, что все использования здесь-документов, которые я видел в сценариях оболочки, также выполняются таким образом. Спецификация POSIX для здесь-документов также использует этот стиль в своих примерах.
Тем не менее, внимательное прочтение других частей спецификации POSIX.1-2008 показывает, что допустимо помещать некоторое количество пробелов или символов табуляции между << и словом-разделителем. В частности, см. Правила распознавания токенов 7 и 10, определение io_here в грамматике оболочки и определение "пустого" класса символов .
Вот как вы документируете оболочку. Делайте заметки, Microsoft. ;)
Тестирование здесь на Bash 4 и ksh93 подтверждает, что это работает как ожидалось.