Como usar "<<" no arquivo em lotes ou no prompt de comando?

12

Eu sei para que >>serve, ele grava todas as mensagens em um arquivo em vez de na tela. E eu acho <<que reverter, eu tento e recebo uma mensagem:<< was unexpected at this time.

Por favor, diga-me o que é <<usado e como usar.

DMaster
fonte

Respostas:

17

O shell padrão de comando do Windows - cmd.exe- não usa o <<operador em tudo

Um único <significa "ler arquivo na entrada padrão " para cmd.exe, mas dois <caracteres consecutivos não fazem sentido cmd.exe, portanto, fornece o erro que você recebeu.

O <<operador é significativo para todos os principais tipos de shell de comando do Unix , onde é usado para os documentos aqui : ²

$ some-command <<END
blah blah blah
blah blah
blah blah blah blah blah
END

Essas três linhas são enviadas para some-commandsua entrada padrão.

Isso é útil para enviar muito texto em um comando sem gravá-lo em um arquivo primeiro, como você faria com o <operador. Eu freqüentemente o uso para incorporar uma mensagem de "uso" em um script:

#!/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

Isso é melhor do que escrever echovárias instruções, pois o texto do heredoc é formatado exatamente como é impresso na tela. Além disso, é mais fácil lidar com espaço em branco, cotação, redirecionamento e interpolação de variáveis ​​nesse contexto. Observe, por exemplo, que usei colchetes angulares na mensagem de uso sem precisar fazer nada inteligente para impedir que o shell tente usá-los para o redirecionamento de E / S.

Se você quiser fazer coisas assim no Windows, poderá instalar o Cygwin e usar uma de suas conchas. Se você estiver no Windows 10, poderá usar o WSL .


Notas de rodapé:

  1. Esse link vai para a árvore de documentação arquivada do Windows XP. A Microsoft quebrou o link que eu estava usando anteriormente quando arquivaram esses documentos. Portanto, caso o quebrem novamente, aqui está uma referência de backup de terceiros.

    O único outro cmd.exematerial de referência que conheço no microsoft.com é o PDF de comandos do Windows (4,9 MB, 948 páginas), que pouco mais do que fornece uma referência para a maioria (!) Dos comandos externos internos e fornecidos pela Microsoft você pode dar no cmdprompt. Este PDF está incompleto em duas bases. Primeiro, e mais relevante aqui, não há discussão combinada de como o redirecionamento funciona no cmd.exeshell; não há sequer uma discussão sobre gramática de shell. Em segundo lugar, a lista de comando do PDF é incompleta: a primeira coisa que aconteceu com a seleção não está coberto: diskpart.

    Eu acredito que tudo isto decorre claras tentativas da Microsoft para substituir cmd.execom PowerShell , que vêm acontecendo há muitos anos. Na atualização mais recente do Windows 10, até o momento em que este artigo foi escrito, eles tomaram outras medidas para ocultar a existênciacmd.exe , embora ainda não tenha desaparecido completamente.

    Vale ressaltar que o PowerShell também não oferece suporte a um <<operador de redirecionamento . Nem - em uma triste regressão dos dois shells do Unix e cmd.exe- ele suporta <redirecionamento!

  2. A maneira canônica de iniciar um documento aqui é como escrevi acima, sem espaço entre a <<palavra delimitadora e a. Minha lembrança difusa é que todos os usos dos documentos aqui que eu vi nos scripts de shell também são feitos dessa maneira. A especificação POSIX para documentos aqui também usa esse estilo em seus exemplos.

    No entanto, uma leitura cuidadosa de outras partes da especificação POSIX.1-2008 revela que é legal colocar algum número de caracteres de espaço ou tabulação entre a <<palavra delimitadora e a. Em particular, ver o reconhecimento simbólico regras 7 e 10 , a definição de io_hereem gramática shell , e a definição de o "blank" classe de personagem .

    É assim que você documenta um shell. Faça anotações, Microsoft. ;)

    Testando aqui no Bash 4 e ksh93confirma que isso funciona conforme o esperado.

Warren Young
fonte
Não poderia ter dito melhor. Exceto que eu não teria mencionado o Cygwin porque há simplesmente algumas coisas que você faz no Windows e outras que você faz no Unix. Há muita compatibilidade cruzada sim, no entanto, eu sugiro fortemente apenas aprender o Unix bruto, em vez de algum trabalho virtual, como o Cygwin ou os vários outros utilitários baseados em Win.
BiTinerary
8
@BiTinerary: Dado que um grande número de pessoas usa o Cygwin diariamente especificamente para poder fazer coisas do tipo Unix no Windows, acho que vou deixar essa dica na resposta.
Warren Young
Sim, não pretendo denegrir a autenticidade que é Cygwin, diabos, uso-a para tarefas mundanas de vez em quando. Estou apenas colocando meus dois centavos que estão inicializando a coisa real e aprendendo que (especialmente para iniciantes) é melhor do que aprender algo de terceiros ou um spin off do original que precisa estar em conformidade com um sistema operacional completamente diferente. Quero apenas dizer que, na quantidade de tempo que leva para configurar o Cygwin, especifique todos os módulos incluídos + comece a usá-lo, você pode ter aprendido muito na coisa real. Eu me sinto como Cygwin é o que você usa depois de ter feito isso e quer apenas não faça a reinicialização
BiTinerary
Nit: (Unix) O heredoc não reconhece redirecionamento e canal, mas, por padrão, reconhece a substituição de parâmetro / variável e substituição de processo (sintaxe do dólar e do backticks); para suprimir aqueles que usam barra invertida nos dados ou citar (pelo menos um caractere) a palavra delimitadora na linha de comando.
Dave_thompson_085
4

> grava em um novo arquivo.

>> anexa a um arquivo

< lê de um arquivo

| envia uma saída de comandos para a entrada de outro comando

Veja aqui para obter uma lista . Digitar% ^ into cmd.exe é um ovo de páscoa do Windows?

Desde que foi publicado, este foi adicionado.

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.
desencadear
fonte