Відповіді:
Стандартна команда оболонки для 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.