Відповіді:
Стандартна команда оболонки для 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тверджень, оскільки текст гередока форматований саме так, як він друкується на екрані. Крім того, у цьому контексті легше мати справу з пробілом, цитуванням, перенаправленням та змінною інтерполяцією. Зауважте, наприклад, що я використовував кутові дужки у повідомленні про використання, не роблячи нічого розумного, щоб оболонка не намагалася використовувати їх для перенаправлення вводу / виводу.
Якщо ви хочете робити подібні дії в Windows, ви можете встановити Cygwin і використовувати один з його оболонок. Якщо у вас є Windows 10, ви можете використовувати WSL замість цього.
Виноски:
Це посилання переходить у архівоване дерево документації Windows XP. Microsoft зламала посилання, яке я використовувала раніше, коли вони архівували ці документи, тож у випадку, якщо вони знову перервуться, ось резервна стороння посилання.
Єдиний інший cmd.exeдовідковий матеріал, про який я знаю на microsoft.com, - це PDF Commands 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підтверджує, що це працює як очікувалося.
Там немає >і , >>але тільки <, немає<<
command < filename Type a text file and pass the text to command
> записує у файл NEW.
>> додає до файлу
< читає з файлу
| посилає команди, що виводяться на вхід іншої команди
Дивіться тут для списку Чи набирається% ^ у cmd.exe писанка для Windows?
З моменту публікації цього додано.
Starting a Program
===============
See start /? and call /? for help on all three ways.
Specify a program name
--------------------------------
c:\windows\notepad.exe
In a batch file the batch will wait for the program to exit. When
typed the command prompt does not wait for graphical
programs to exit.
If the program is a batch file control is transferred and the rest of the calling batch file is not executed.
Use Start command
--------------------------
start "" c:\windows\notepad.exe
Start starts a program and does not wait. Console programs start in a new window. Using the /b switch forces console programs into the same window, which negates the main purpose of Start.
Start uses the Windows graphical shell - same as typing in WinKey + R (Run dialog). Try
start shell:cache
Use Call command
-------------------------
Call is used to start batch files and wait for them to exit and continue the current batch file.