Стандартная команда оболочки для 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
подтверждает, что это работает как ожидалось.