Як використовувати "<<" у пакетному файлі чи командному рядку?


13

Я знаю, для чого >>використовується, він записує всі повідомлення у файл замість екрана. І я здогадуюсь <<зворотного, я спробую це і отримаю повідомлення:<< was unexpected at this time.

Скажіть, будь ласка, <<для чого і як користуватися.

Відповіді:


17

Стандартна команда оболонки для 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 замість цього.


Виноски:

  1. Це посилання переходить у архівоване дерево документації 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- чи підтримує це <перенаправлення!

  2. Канонічний спосіб започаткувати документ тут - це, як я написав вище, без пробілу між <<словом та роздільником. Моє нечітке спогад полягає в тому, що всі використання тут-документів, які я бачив у скриптах оболонки, також робляться таким чином. Специфікація POSIX для тут-документів також використовує цей стиль у своїх прикладах.

    Однак уважне читання інших частин специфікації POSIX.1-2008 виявляє, що законно розміщувати деяку кількість символів пробілу чи вкладки між <<словом та роздільником. Зокрема, см лексема визнання правила 7 і 10 , визначення io_hereв граматиці оболонки , а також визначення в «порожній» класу символів .

    Ось так ви документуєте оболонку. Ведіть нотатки, Microsoft. ;)

    Тестування тут на Bash 4 і ksh93підтверджує, що це працює як очікувалося.


Я не міг би сказати це краще і сам. За винятком я б не згадував Cygwin, тому що у Windows просто є щось, що ви робите, і інші, що ви робите з Unix. Є багато перехресної сумісності, але я настійно рекомендую просто вивчити необроблений Unix, а не якусь віртуальну роботу, як-то Cygwin або кілька інших утилітів на основі Win.
БіТінерарі

8
@BiTinerary: Зважаючи на те, що величезна кількість людей щодня використовує Cygwin спеціально для того, щоб мати змогу робити Unix-подібні речі в Windows, я думаю, я залишу цей натяк у відповіді.
Воррен Янг

Так, я не маю на увазі приниження автентичності, що є Cygwin, пекло, я використовую її для щоденних завдань раз у раз. Я просто вкладаю два мої центи, що підсилює реальну річ і дізнаюсь, що (особливо для початківців) краще, ніж навчитися чомусь третьої сторони або відкрутити оригінал, який повинен відповідати зовсім іншій ОС. Я просто хочу сказати, що за час, необхідний для настройки Cygwin, вкажіть усі включені модулі + почніть його використовувати, ви могли б багато чого навчитися у реальній справі. Я відчуваю, що Cygwin - це те, що ви використовуєте після того, як ви це зробили, і просто не хочете перезавантажуватися
BiTinerary

Nit: (Unix) heredoc не розпізнає перенаправлення та передачу даних, але за замовчуванням НЕ визнає підстановку параметрів / змінних та підміну процесу (як синтаксиси доларів-паронів, так і синтаксиси backticks); щоб придушити тих, хто використовує звороту косу рису в даних або цитує (принаймні одне знака) слово-роздільник у командному рядку.
dave_thompson_085


4

> записує у файл 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.