Wie verwende ich "<<" in einer Batchdatei oder einer Eingabeaufforderung?

14

Ich weiß, wofür >>verwendet wird, es schreibt alle Nachrichten in eine Datei anstelle des Bildschirms. Und ich denke, <<mache es umgekehrt, ich versuche es und erhalte eine Nachricht:<< was unexpected at this time.

Bitte sagen Sie mir, wofür <<und wie verwendet wird.

DMaster
quelle

Antworten:

17

Die Standard-Windows-Befehlsshell - cmd.exe- verwendet den <<Operator überhaupt nicht

Ein einzelnes <bedeutet "Datei in Standardeingabe einlesen " cmd.exe, aber zwei <Zeichen hintereinander sind bedeutungslos cmd.exe, sodass der Fehler angezeigt wird, den Sie erhalten haben.

Der <<Operator ist für alle wichtigen Arten von Unix-Befehlsshells von Bedeutung , wo er für die folgenden Dokumente verwendet wird : ²

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

Diese drei Zeilen werden some-commandan die Standardeingabe gesendet .

Dies ist nützlich, um viel Text in einen Befehl zu senden, ohne ihn zuerst in eine Datei zu schreiben, wie Sie es mit dem <Operator tun müssten. Ich verwende es häufig, um eine "Verwendungs" -Nachricht in ein Skript einzubetten:

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

Dies ist besser als das Schreiben einer Reihe von echoAnweisungen, da der Heredoc-Text genau so formatiert ist, wie er auf dem Bildschirm gedruckt wird. Darüber hinaus ist es in diesem Zusammenhang einfacher, mit Leerzeichen, Anführungszeichen, Umleitung und variabler Interpolation umzugehen. Beachten Sie beispielsweise, dass ich in der Verwendungsnachricht spitze Klammern verwendet habe, ohne etwas Kluges tun zu müssen, um zu verhindern, dass die Shell versucht, sie für die E / A-Umleitung zu verwenden.

Wenn Sie solche Dinge unter Windows ausführen möchten, können Sie Cygwin installieren und eine seiner Shells verwenden. Wenn Sie unter Windows 10 arbeiten, können Sie stattdessen WSL verwenden.


Fußnoten:

  1. Dieser Link wird in den archivierten Windows XP-Dokumentationsbaum eingefügt. Microsoft hat den Link, den ich zuvor beim Archivieren dieser Dokumente verwendet habe, unterbrochen. Falls sie ihn erneut unterbrechen, finden Sie hier eine Sicherungsreferenz eines Drittanbieters.

    Das einzige andere cmd.exeReferenzmaterial, das mir auf microsoft.com bekannt ist, ist das Windows-Befehls-PDF (4,9 MB, 948 Seiten), das kaum mehr als eine Referenz für die meisten (!) Der integrierten und von Microsoft bereitgestellten externen Befehle darstellt Sie können an der cmdEingabeaufforderung geben. Dieses PDF ist aus zwei Gründen unvollständig. Erstens, und hier am relevantesten, gibt es keine kombinierte Diskussion darüber, wie die Umleitung in der cmd.exeShell funktioniert . Es gibt nicht einmal eine Diskussion über die Shell-Grammatik. Zweitens ist die Befehlsliste des PDF unvollständig: Das erste, was ich überprüft habe, wird nicht behandelt : diskpart.

    Ich glaube , all dies folgt aus Microsofts klaren Versuchen zu ersetzen cmd.exemit Powershell , die nun schon seit vielen Jahren an wurde. In dem neuesten Windows 10-Update zum jetzigen Zeitpunkt haben sie weitere Schritte unternommen, um die Existenz von zu verbergencmd.exe , obwohl es noch nicht vollständig verschwunden ist.

    Es ist erwähnenswert, dass PowerShell auch keinen <<Umleitungsoperator unterstützt . Auch - in einer traurigen Regression von beiden Unix-Shells und cmd.exe- unterstützt es die <Umleitung nicht!

  2. Der kanonische Weg, um ein Here-Dokument zu starten, ist so, wie ich es oben geschrieben habe, ohne Leerzeichen zwischen dem <<und dem Trennwort. Meine unscharfe Erinnerung ist, dass alle Verwendungen von Here-Dokumenten, die ich in Shell-Skripten gesehen habe, auch auf diese Weise erfolgen. Die POSIX-Spezifikation für Here-Dokumente verwendet diesen Stil auch in ihren Beispielen.

    Eine sorgfältige Lektüre anderer Teile der POSIX.1-2008-Spezifikation zeigt jedoch, dass es zulässig ist, zwischen dem <<und dem Trennwort eine gewisse Anzahl von Leerzeichen oder Tabulatoren zu setzen . Siehe insbesondere die Tokenerkennungsregeln 7 und 10 , die Definition io_herein der Shell-Grammatik und die Definition der "leeren" Zeichenklasse .

    So dokumentieren Sie eine Shell. Machen Sie sich Notizen, Microsoft. ;)

    Testen Sie hier auf Bash 4 und ksh93bestätigen Sie, dass dies wie erwartet funktioniert.

Warren Young
quelle
Hätte ich nicht besser sagen können. Außer ich hätte Cygwin nicht erwähnt, weil es einfach Dinge gibt, die Sie in Windows tun, und andere, die Sie mit Unix tun. Es gibt eine Menge Kreuzkompatibilität, aber ich würde dringend empfehlen, nur rohes Unix zu lernen, anstatt eine virtuelle Arbeit wie Cygwin oder die verschiedenen anderen Win-basierten Dienstprogramme.
BiTinerary
8
@BiTinerary: Angesichts der Tatsache, dass eine große Anzahl von Menschen Cygwin täglich speziell verwendet, um Unix-ähnliche Dinge unter Windows ausführen zu können, werde ich diesen Hinweis in der Antwort belassen.
Warren Young
Ja, ich will die Authentizität von Cygwin nicht herabsetzen, zum Teufel benutze ich sie ab und zu für alltägliche Aufgaben. Ich setze nur meine zwei Cent ein, um die Realität zu starten und zu lernen, dass (insbesondere für Anfänger) es besser ist, etwas von Drittanbietern oder ein Spin-off des Originals zu lernen, das einem völlig anderen Betriebssystem entsprechen muss. Ich möchte nur sagen, dass Sie in der Zeit, die zum Einrichten von Cygwin benötigt wird, alle enthaltenen Module angeben und mit der Verwendung beginnen, in der Realität viel gelernt haben könnten. Ich denke, Cygwin ist das, was Sie verwenden, nachdem Sie das getan haben und wollen einfach nicht neu
starten
Nit: (Unix) heredoc erkennt keine Umleitung und Pipe, erkennt jedoch standardmäßig die Substitution von Parametern / Variablen und die Substitution von Prozessen (sowohl Dollar-Parens- als auch Backticks-Syntax). Um diese zu unterdrücken, verwenden Sie einen Backslash in den Daten oder zitieren (mindestens ein Zeichen) das Trennwort in der Befehlszeile.
dave_thompson_085
4

> schreibt in eine NEUE Datei.

>> an eine Datei anhängen

< liest aus einer Datei

| sendet eine Befehlsausgabe an die Eingabe eines anderen Befehls

Eine Liste finden Sie hier. Ist die Eingabe von% ^ in cmd.exe ein Windows-Osterei?

Seitdem wurde dies hinzugefügt.

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.
auslösen
quelle