Как использовать «<<» в командном файле или командной строке?

12

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

Скажите, пожалуйста, для чего <<и как использовать.

DMaster
источник

Ответы:

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утверждений, поскольку текст heredoc отформатирован точно так, как он выводится на экран. Кроме того, в этом контексте легче иметь дело с пробелами, цитированием, перенаправлением и интерполяцией переменных. Обратите внимание, например, на то, что я использовал угловые скобки в сообщении об использовании без необходимости делать что-то умное, чтобы оболочка не пыталась использовать их для перенаправления ввода / вывода.

Если вы хотите делать подобные вещи в Windows, вы можете установить Cygwin и использовать один из его оболочек. Если вы используете Windows 10, вы можете использовать WSL .


Примечания:

  1. Эта ссылка идет в архивированное дерево документации 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- он не поддерживает <перенаправление!

  2. Канонический способ начать здесь-документ, как я уже писал выше, без пробела между <<словом и разделителем. Мое неясное воспоминание состоит в том, что все случаи использования здесь документов, которые я видел в сценариях оболочки, также выполняются таким образом. Спецификация POSIX для здесь-документов также использует этот стиль в своих примерах.

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

    Вот как вы документируете оболочку. Делайте заметки, Microsoft. ;)

    Тестирование здесь на Bash 4 и ksh93подтверждает, что это работает, как ожидалось.

Уоррен Янг
источник
Не мог бы сказать это лучше сам. За исключением того, что я бы не упомянул Cygwin, потому что есть кое-что, что вы делаете в Windows, и то, что вы делаете в Unix. Да, есть много возможностей для кросс-совместимости, но я бы настоятельно рекомендовал просто изучать сырой Unix, а не какую-нибудь виртуальную работу вокруг, такую ​​как Cygwin или несколько других утилит на основе Win.
BiTinerary
8
@BiTinerary: учитывая, что огромное количество людей использует Cygwin ежедневно специально для того, чтобы делать Unix-подобные вещи в Windows, я думаю, что оставлю эту подсказку в ответе.
Уоррен Янг
Да, я не хочу унижать подлинность Cygwin, черт возьми, я использую его для мирских задач время от времени. Я просто вставляю свои два цента, которые загружают реальную вещь и учат, что (особенно для начинающих) лучше, чем учить что-то третье лицо или дополнительный оригинал, который должен соответствовать совершенно другой ОС. Я просто хочу сказать, что за время, необходимое для настройки Cygwin, укажите все включенные модули + начните использовать его, вы могли бы многому научиться в реальной жизни. Я чувствую, что Cygwin - это то, что вы используете после того, как вы это сделали, и просто не хотите перезагружаться
BiTinerary
Nit: (Unix) heredoc не распознает перенаправление и канал, но по умолчанию DOES распознает подстановку параметров / переменных и подстановку процессов (как синтаксисы типа «доллар-парен», так и синтаксис обратных ссылок); чтобы подавить их, используйте обратную косую черту в данных или заключите в кавычки (хотя бы один символ) слово-разделитель в командной строке.
dave_thompson_085
4

> пишет в новый файл.

>> добавляет в файл

< читает из файла

| отправляет вывод команды на вход другой команды

См. Здесь список. Является ли ввод% ^ into 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.
триггер
источник