Comment utiliser «<<» dans un fichier de commandes ou une invite de commande?

12

Je sais à quoi >>ça sert, il écrit tous les messages dans un fichier au lieu de l'écran. Et je suppose <<que j'inverse, je l'essaye et je reçois un message:<< was unexpected at this time.

Veuillez me dire à quoi <<sert et comment l'utiliser.

DMaster
la source

Réponses:

17

Le shell de commande Windows standard - cmd.exe- n'utilise pas du tout l' <<opérateur .¹

Un seul <signifie «lire le fichier dans l'entrée standard » cmd.exe, mais deux <caractères consécutifs n'ont pas de sens cmd.exe, ce qui donne l'erreur que vous avez.

L' <<opérateur est significatif pour tous les principaux types de shell de commande Unix , où il est utilisé pour les documents ici : ²

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

Ces trois lignes sont envoyées à some-commandson entrée standard.

C'est utile pour envoyer beaucoup de texte dans une commande sans l'écrire d'abord dans un fichier, comme vous le feriez avec l' <opérateur. Je l'utilise fréquemment pour incorporer un message "d'utilisation" dans 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

C'est mieux que d'écrire un tas de echodéclarations car le texte hérédoc est formaté exactement comme il s'imprime à l'écran. De plus, il est plus facile de gérer les espaces blancs, les citations, la redirection et l'interpolation variable dans ce contexte. Notez, par exemple, que j'ai utilisé des crochets dans le message d'utilisation sans avoir à faire quoi que ce soit d'intelligent pour empêcher le shell d'essayer de les utiliser pour la redirection d'E / S.

Si vous voulez faire des choses comme ça sur Windows, vous pouvez installer Cygwin et utiliser l'un de ses shells. Si vous êtes sous Windows 10, vous pouvez utiliser WSL à la place.


Notes de bas de page:

  1. Ce lien va dans l'arborescence de documentation archivée de Windows XP. Microsoft a rompu le lien que j'utilisais précédemment lors de l'archivage de ces documents, donc au cas où ils le briseraient à nouveau, voici une référence tierce de sauvegarde.

    Le seul autre cmd.exedocument de référence que je connaisse sur microsoft.com est le PDF des commandes Windows (4,9 Mo, 948 pages) qui ne fait guère plus que fournir une référence pour la plupart (!) Des commandes externes intégrées et fournies par Microsoft vous pouvez donner à l' cmdinvite. Ce PDF est incomplet sur deux bases. Premièrement, et le plus pertinent ici, il n'y a pas de discussion combinée sur le fonctionnement de la redirection dans le cmd.exeshell; il n'y a même pas de discussion sur la grammaire du shell. En second lieu , la liste des commandes du PDF est incomplète: la première chose que je me trouvais à cocher est couvert: diskpart.

    Je crois que tout cela découle des tentatives claires de Microsoft de remplacer cmd.exepar PowerShell , qui durent depuis de nombreuses années maintenant. Dans la dernière mise à jour de Windows 10 au moment de la rédaction de ce document, ils ont pris de nouvelles mesures pour masquer l'existence decmd.exe , bien qu'elle ne soit pas encore complètement disparue.

    Il convient de noter que PowerShell ne prend également pas en charge un <<opérateur de redirection . Ni - dans une triste régression des deux shells Unix et cmd.exe- ne prend-il en charge la <redirection!

  2. La manière canonique de démarrer un document ici est comme je l'ai écrit ci-dessus, sans espace entre le <<et le mot délimiteur. Mon souvenir flou est que toutes les utilisations des documents ici que j'ai vus dans les scripts shell se font également de cette façon. La spécification POSIX pour here-documents utilise également ce style dans ses exemples.

    Cependant, une lecture attentive des autres parties de la spécification POSIX.1-2008 révèle qu'il est légal de mettre un certain nombre d'espaces ou de tabulations entre le <<et le mot délimiteur. Voir en particulier les règles de reconnaissance de jetons 7 et 10 , la définition de io_heredans la grammaire du shell et la définition de la classe de caractères "vierge" .

    Voilà comment vous documentez un shell. Prenez des notes, Microsoft. ;)

    Test ici sur Bash 4 et ksh93confirme que cela fonctionne comme prévu.

Warren Young
la source
Je n'aurais pas dit mieux moi même. Sauf que je n'aurais pas mentionné Cygwin car il y a simplement des choses que vous faites dans Windows et d'autres que vous faites avec Unix. Il y a beaucoup de compatibilité croisée oui, mais je suggérerais fortement d'apprendre simplement Unix plutôt que de travailler virtuellement comme Cygwin ou les autres utilitaires basés sur Win.
BiTinerary
8
@BiTinerary: Étant donné qu'un grand nombre de personnes utilisent Cygwin quotidiennement spécifiquement pour pouvoir faire des choses de type Unix sur Windows, je pense que je vais laisser cet indice dans la réponse.
Warren Young
Oui, je ne veux pas rabaisser l'authenticité de Cygwin, bon sang je l'utilise pour des tâches banales de temps en temps. Je mets juste mes deux cents qui démarrent la vraie chose et apprennent que (en particulier pour les débutants) est mieux que d'apprendre quelque chose de tiers ou un spin-off de l'original qui doit se conformer à un système d'exploitation complètement différent. Je veux juste dire que dans le temps qu'il faut pour configurer Cygwin, spécifier tous les modules inclus + commencer à l'utiliser, vous auriez pu apprendre beaucoup de choses réelles. J'ai l'impression que Cygwin est ce que vous utilisez après avoir fait cela et que vous ne voulez tout simplement pas redémarrer
BiTinerary
Nit: (Unix) heredoc ne reconnaît pas la redirection et le pipe, mais reconnaît par défaut la substitution de paramètres / variables et la substitution de processus (à la fois les syntaxes dollar-parens et backticks); pour les supprimer, utilisez une barre oblique inverse dans les données ou citez (au moins un caractère) le mot délimiteur sur la ligne de commande.
dave_thompson_085
4

> écrit dans un NOUVEAU fichier.

>> ajoute à un fichier

< lit à partir d'un fichier

| envoie une sortie de commandes dans l'entrée d'une autre commande

Voir ici pour une liste La saisie de% ^ dans cmd.exe est-elle un œuf de Pâques Windows?

Depuis que cela a été publié, cela a été ajouté.

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.
déclencheur
la source