¿Cómo utilizar "<<" en el archivo por lotes o símbolo del sistema?

12

Sé para qué >>se utiliza, escribe todos los mensajes en un archivo en lugar de en la pantalla. Y supongo <<que al revés, lo intento y recibo un mensaje:<< was unexpected at this time.

Por favor, dime para qué se <<usa y cómo usarlo.

DMaster
fuente

Respuestas:

17

El shell de comandos estándar de Windows cmd.exe- no utiliza el <<operador en absoluto .

Un solo <significa "leer el archivo en la entrada estándar " cmd.exe, pero dos <caracteres consecutivos no tienen sentido cmd.exe, por lo que da el error que obtuvo.

El <<operador es significativo para todos los tipos principales de shell de comandos de Unix , donde se usa para documentos aquí : ²

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

Esas tres líneas se envían a some-commandsu entrada estándar.

Esto es útil para enviar gran cantidad de texto a un comando sin escribirlo primero en un archivo, ya que tendría que hacerlo con el <operador. Con frecuencia lo uso para incrustar un mensaje de "uso" en un 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

Esto es mejor que escribir un montón de echodeclaraciones ya que el texto heredoc está formateado exactamente como se imprime en la pantalla. Además, es más fácil lidiar con el espacio en blanco, las citas, la redirección y la interpolación variable en este contexto. Observe, por ejemplo, que he usado corchetes angulares en el mensaje de uso sin tener que hacer nada inteligente para evitar que el shell intente usarlos para la redirección de E / S.

Si desea hacer cosas como esta en Windows, puede instalar Cygwin y usar uno de sus shells. Si está en Windows 10, podría usar WSL en su lugar.


Notas al pie:

  1. Ese enlace va al árbol de documentación archivado de Windows XP. Microsoft rompió el enlace que estaba usando anteriormente cuando archivaron estos documentos, por lo que en caso de que lo rompan nuevamente, aquí hay una referencia de respaldo de terceros.

    El único otro cmd.exematerial de referencia que conozco en microsoft.com es el PDF de comandos de Windows (4.9 MB, 948 páginas) que hace poco más que proporcionar una referencia para la mayoría (!) De los comandos externos integrados y provistos por Microsoft Puedes dar en el momento cmd. Este PDF está incompleto en dos bases. Primero, y lo más relevante aquí, no hay una discusión combinada de cómo funciona la redirección en el cmd.exeshell; Ni siquiera hay una discusión sobre la gramática de shell. En segundo lugar, la lista de comandos del PDF es incompleta: lo primero que se me ocurrió de verificación no está cubierto: diskpart.

    Creo que todo esto se deriva de los claros intentos de Microsoft de reemplazar cmd.execon PowerShell , que han estado sucediendo durante muchos años. En la actualización más reciente de Windows 10 a partir de este escrito, han tomado medidas adicionales para ocultar la existencia decmd.exe , aunque aún no se ha eliminado por completo.

    Vale la pena señalar que PowerShell tampoco es compatible con un <<operador de redirección . Ni, en una triste regresión de ambos shells de Unix y cmd.exe, ¿es compatible con la <redirección!

  2. La forma canónica de comenzar un documento aquí es como lo he escrito anteriormente, sin espacio entre la <<palabra delimitador y la delimitador. Mi recuerdo borroso es que todos los usos de los documentos aquí que he visto en los scripts de shell también se realizan de esta manera. La especificación POSIX para documentos aquí también utiliza este estilo en sus ejemplos.

    Sin embargo, una lectura cuidadosa de otras partes de la especificación POSIX.1-2008 revela que es legal colocar cierto número de espacios o caracteres de tabulación entre la <<palabra delimitador y la delimitador. En particular, ver las reglas de reconocimiento simbólico 7 y 10 , la definición de io_hereen la gramática cáscara , y la definición de la clase de caracteres "en blanco" .

    Así es como documentas un shell. Toma notas, Microsoft. ;)

    Prueba aquí en Bash 4 y ksh93confirma que esto funciona como se esperaba.

Warren Young
fuente
No podría haberlo dicho mejor. Excepto que no habría mencionado a Cygwin porque simplemente hay algunas cosas que haces en Windows y otras que haces con Unix. Hay mucha compatibilidad cruzada, sí, sin embargo, sugeriría encarecidamente que solo aprenda Unix sin procesar en lugar de algún trabajo virtual como Cygwin o las otras utilidades basadas en Win.
BiTinerary
8
@BiTinerary: dado que una gran cantidad de personas usan Cygwin a diario específicamente para poder hacer cosas similares a Unix en Windows, creo que dejaré esa pista en la respuesta.
Warren Young
Sí, no pretendo degradar la autenticidad que es Cygwin, demonios, lo uso para tareas mundanas de vez en cuando. Solo estoy poniendo mis dos centavos que están arrancando lo real y aprendiendo que (especialmente para los principiantes) es mejor que aprender algo de terceros o un spin-off del original que tiene que conformarse con un sistema operativo completamente diferente. Solo quiero decir que en la cantidad de tiempo que lleva configurar Cygwin, especificar todos los módulos incluidos + comenzar a usarlo, podría haber aprendido mucho en la realidad. Siento que Cygwin es lo que usas después de haber hecho eso y simplemente no quieres reiniciar
BiTinerary
Nit: (Unix) heredoc no reconoce la redirección y la canalización, pero por defecto SÍ reconoce la sustitución de parámetros / variables y la sustitución de procesos (sintaxis dólar-parens y backticks); para suprimirlos, utilice la barra diagonal inversa en los datos o comillas (al menos un carácter de) la palabra delimitador en la línea de comando.
dave_thompson_085
4

> escribe en un NUEVO archivo.

>> se agrega a un archivo

< lee de un archivo

| envía una salida de comandos a la entrada de otro comando

Ver aquí para obtener una lista ¿Escribir% ^ en cmd.exe es un huevo de Pascua de Windows?

Desde que se publicó esto se ha agregado.

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.
desencadenar
fuente