12

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

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

3 ответа3

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

6

Есть > и >> но только < , нет <<

command < filename        Type a text file and pass the text to command

Источник: http://ss64.com/nt/syntax-redirection.html

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .