Come utilizzare "<<" nel file batch o nel prompt dei comandi?


12

So a cosa >>serve, scrive tutti i messaggi in un file invece che sullo schermo. E credo di <<fare il contrario, lo provo e ricevo un messaggio:<< was unexpected at this time.

Per favore, dimmi a cosa <<serve e come si usa.

Risposte:


17

Il comando di shell standard di Windows - cmd.exe- non utilizza il <<gestore a tutti

Un singolo <significa "leggere il file nell'input standard " cmd.exe, ma due <caratteri back-to-back non hanno senso cmd.exe, quindi dà l'errore che hai.

L' <<operatore è significativo per tutti i principali tipi di shell dei comandi Unix , dove viene utilizzato per i documenti qui : ²

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

Queste tre righe vengono inviate some-commandsul suo input standard.

Ciò è utile per inviare molto testo in un comando senza prima scriverlo in un file, come si farebbe con l' <operatore. Lo uso spesso per incorporare un messaggio di "utilizzo" in uno 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

È meglio che scrivere un sacco di echoaffermazioni poiché il testo ereditario è formattato esattamente come viene stampato sullo schermo. Inoltre, è più semplice gestire spazi bianchi, quotazioni, reindirizzamenti e interpolazione variabile in questo contesto. Si noti, ad esempio, che ho usato le parentesi angolari nel messaggio di utilizzo senza dover fare nulla di intelligente per impedire alla shell di provare a usarle per il reindirizzamento I / O.

Se vuoi fare cose del genere su Windows, puoi installare Cygwin e usare una delle sue shell. Se sei su Windows 10, puoi invece usare WSL .


Note:

  1. Tale collegamento va nella struttura di documentazione archiviata di Windows XP. Microsoft ha interrotto il collegamento che stavo utilizzando in precedenza durante l'archiviazione di questi documenti, quindi nel caso in cui lo rompano di nuovo, ecco un riferimento di terze parti di backup.

    L'unico altro cmd.exemateriale di riferimento di cui sono a conoscenza su microsoft.com è il PDF dei comandi di Windows (4,9 MB, 948 pagine) che non fa altro che fornire un riferimento per la maggior parte (!) Dei comandi esterni integrati e forniti da Microsoft puoi dare al cmdprompt. Questo PDF è incompleto su due basi. In primo luogo, e più rilevante qui, non vi è alcuna discussione combinata su come funziona il reindirizzamento nella cmd.exeshell; non c'è nemmeno una discussione sulla grammatica della shell. In secondo luogo, la lista dei comandi del PDF è incompleta: la prima cosa che mi è capitato di controllo non è coperto: diskpart.

    Credo che tutto questo consegue chiari tentativi di Microsoft di sostituire cmd.execon PowerShell , che sono in corso da molti anni ormai. Nell'ultimo aggiornamento di Windows 10 al momento della stesura di questo documento, hanno preso ulteriori provvedimenti per nascondere l'esistenza dicmd.exe , anche se non è ancora completamente andato.

    Vale la pena notare che anche PowerShell non supporta un <<operatore di reindirizzamento . Né - in una triste regressione da entrambe le shell Unix e cmd.exe- supporta il <reindirizzamento!

  2. Il modo canonico di iniziare un documento qui è come l'ho scritto sopra, senza spazio tra la <<parola e il delimitatore. Il mio confuso ricordo è che tutti gli usi dei documenti qui che ho visto negli script di shell sono fatti in questo modo. Anche la specifica POSIX per i documenti qui usa questo stile nei suoi esempi.

    Tuttavia, un'attenta lettura di altre parti della specifica POSIX.1-2008 rivela che è legale inserire un numero di spazi o caratteri di tabulazione tra la <<parola e il delimitatore. In particolare, vedere le regole di riconoscimento token 7 e 10 , la definizione io_herenella grammatica della shell e la definizione della classe di caratteri "vuota" .

    Ecco come documentare una shell. Prendi appunti, Microsoft. ;)

    Test qui su Bash 4 e ksh93conferma che funziona come previsto.


Non avrei potuto dirlo meglio da solo. Tranne il fatto che non avrei menzionato Cygwin perché c'è semplicemente qualcosa che fai in Windows e altri che fai con Unix. C'è molta compatibilità incrociata sì, tuttavia suggerirei vivamente di imparare Unix crudo piuttosto che un po 'di lavoro virtuale come Cygwin o molte altre utility basate su Win.
BiTinerary,

8
@BiTinerary: dato che un numero enorme di persone usa Cygwin quotidianamente in modo specifico per essere in grado di fare cose simili a Unix su Windows, penso che lascerò quel suggerimento nella risposta.
Warren Young,

Sì, non intendo indebolire l'autenticità di Cygwin, diavolo lo uso per compiti banali di tanto in tanto. Sto solo inserendo i miei due centesimi che stanno avviando la cosa reale e imparando che (specialmente per i principianti) è meglio che imparare qualcosa di terze parti o uno spin off dell'originale che deve conformarsi a un sistema operativo completamente diverso. Intendo solo dire che nella quantità di tempo necessaria per configurare Cygwin, specificare tutti i moduli inclusi + iniziare a usarlo, avresti potuto imparare molto nella realtà. Sento che Cygwin è quello che usi dopo averlo fatto e non voglio riavviare
BiTinerary

Nit: (Unix) heredoc non riconosce reindirizzamento e pipe, ma di default riconosce la sostituzione di parametri / variabili e la sostituzione di processo (sia sintassi del dollaro che backtick); per sopprimere quelli usano la barra rovesciata nei dati o cita (almeno un carattere di) la parola delimitatore sulla riga di comando.
dave_thompson_085


4

> scrive in un NUOVO file.

>> accoda a un file

< legge da un file

| invia un output di comandi nell'input di un altro comando

Vedi qui per un elenco Digitare% ^ in cmd.exe è un uovo di Pasqua di Windows?

Da quando è stato pubblicato, questo è stato aggiunto.

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.