Odpowiedzi:
Standardowe polecenie powłoki Windows - cmd.exe
- nie używa się <<
operatora w ogóle .¹
Pojedyncza <
oznacza „wczytaj plik do standardowego wejścia ” do cmd.exe
, ale dwa <
znaki jeden po drugim są bez znaczenia cmd.exe
, więc daje to błąd, który wystąpił.
<<
Operatora jest znaczące dla wszystkich głównych typów Unix polecenia powłoki , gdzie stosuje się do wstawki dokumentach : ²
$ some-command <<END
blah blah blah
blah blah
blah blah blah blah blah
END
Te trzy wiersze są wysyłane some-command
na standardowe wejście.
Jest to przydatne do wysyłania dużej ilości tekstu do polecenia bez zapisywania go najpierw do pliku, tak jak w przypadku <
operatora. Często używam go do osadzania w skrypcie komunikatu „użycie”:
#!/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
Jest to lepsze niż pisanie wielu echo
instrukcji, ponieważ tekst heredoc jest sformatowany dokładnie tak, jak drukuje się na ekranie. Ponadto w tym kontekście łatwiej jest poradzić sobie z białą spacją, cytowaniem, przekierowaniem i interpolacją zmiennych. Zauważ, na przykład, że użyłem nawiasów kątowych w komunikacie użycia bez konieczności robienia czegokolwiek sprytnego, aby zapobiec próbie użycia powłoki przez przekierowanie I / O.
Jeśli chcesz robić takie rzeczy w systemie Windows, możesz zainstalować Cygwin i użyć jednej z jego powłok. Jeśli korzystasz z systemu Windows 10, możesz zamiast tego użyć WSL .
Przypisy:
Ten link przechodzi do zarchiwizowanego drzewa dokumentacji systemu Windows XP. Microsoft złamał łącze, którego wcześniej użyłem podczas archiwizacji tych dokumentów, więc na wypadek, gdyby je ponownie zepsuły, oto zapasowe odniesienie innej firmy.
Jedynym innym cmd.exe
materiałem referencyjnym, który znam na microsoft.com, jest plik PDF z komendami systemu Windows (4,9 MB, 948 stron), który zapewnia niewiele więcej niż tylko odniesienie do większości (!) Wbudowanych i dostarczonych przez Microsoft zewnętrznych poleceń możesz podać w odpowiedzi na cmd
monit. Ten plik PDF jest niekompletny z dwóch powodów. Po pierwsze i najistotniejsze tutaj, nie ma połączonej dyskusji o tym, jak działa przekierowanie w cmd.exe
powłoce; nie ma nawet dyskusji na temat gramatyki powłoki. Po drugie, lista poleceń PDF jest niekompletna: pierwszą rzeczą, jaką się do odprawy nie są objęte: diskpart
.
Wierzę, że wszystko to wynika z wyraźnych prób zastąpienia cmd.exe
przez PowerShell Microsoftu , które trwają od wielu lat. W najnowszej aktualizacji systemu Windows 10 od tego momentu poczyniono dalsze kroki, aby ukryć istnieniecmd.exe
, choć nie zostało jeszcze całkowicie usunięte.
Warto zauważyć, że PowerShell również nie obsługuje <<
operatora przekierowania . Ani też - w smutnej regresji z obu powłok Uniksa i cmd.exe
- nie obsługuje <
przekierowania!
Kanoniczny sposób na rozpoczęcie dokumentu tutaj jest taki, jak napisałem powyżej, bez odstępu między <<
słowem ogranicznika a ogranicznikiem. Moje rozmyte wspomnienie jest takie, że wszystkie zastosowania dokumentów tutaj, które widziałem w skryptach powłoki, są również wykonywane w ten sposób. Specyfikacja POSIX dla dokumentów tutaj również używa tego stylu w swoich przykładach.
Jednak uważna lektura innych części specyfikacji POSIX.1-2008 pokazuje, że dozwolone jest umieszczanie pewnej liczby znaków spacji lub tabulacji między <<
słowem a znakiem ograniczającym. W szczególności, patrz żeton uznanie zasady 7 i 10 , definicja io_here
w gramatyce powłoki , a definicja na „Blank” klasy postaci .
W ten sposób dokumentujesz powłokę. Rób notatki, Microsoft. ;)
Testowanie tutaj na Bash 4 i ksh93
potwierdza, że działa to zgodnie z oczekiwaniami.
Jest >
i >>
tylko <
nie ma<<
command < filename Type a text file and pass the text to command
>
zapisuje do NOWEGO pliku.
>>
dołącza się do pliku
<
czyta z pliku
|
wysyła dane wyjściowe poleceń do danych wejściowych innego polecenia
Zobacz tutaj, czy lista Czy wpisywanie% ^ w cmd.exe jest pisanką systemu Windows?
Od czasu opublikowania zostało to dodane.
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.