Jak używać „<<” w pliku wsadowym lub wierszu polecenia?

13

Wiem do czego >>służy, zapisuje wszystkie wiadomości do pliku zamiast do ekranu. I chyba <<odwrotnie, próbuję i otrzymuję komunikat:<< was unexpected at this time.

Poinformuj mnie, do czego <<służy i jak używać.

DMaster
źródło

Odpowiedzi:

17

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-commandna 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 echoinstrukcji, 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:

  1. 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.exemateriał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 cmdmonit. 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.exepowł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.exeprzez 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!

  2. 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_herew 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 ksh93potwierdza, że ​​działa to zgodnie z oczekiwaniami.

Warren Young
źródło
Nie mógłbym tego lepiej powiedzieć. Tyle że nie wspomniałbym o Cygwinie, ponieważ jest coś, co robisz w systemie Windows i inne, które robisz z Uniksem. Istnieje wiele wzajemnych kompatybilności tak, jednak zdecydowanie sugerowałbym po prostu naukę surowego Uniksa zamiast wirtualnych prac, takich jak Cygwin lub kilka innych narzędzi opartych na Win.
BiTinerary
8
@BiTinerary: Biorąc pod uwagę, że ogromna liczba osób korzysta z Cygwin codziennie, aby móc robić rzeczy uniksowe w systemie Windows, myślę, że zostawię tę wskazówkę w odpowiedzi.
Warren Young,
Tak, nie zamierzam osłabiać autentyczności, jaką jest Cygwin, do diabła, używam go do codziennych zadań. Po prostu wkładam dwa centy, które uruchamiają prawdziwą rzecz i dowiaduję się, że (szczególnie dla początkujących) jest lepsze niż uczenie się czegoś innego lub oderwanie się od oryginału, który musi być zgodny z zupełnie innym systemem operacyjnym. Chciałbym tylko powiedzieć, że ile czasu zajmuje konfiguracja Cygwina, określ wszystkie dołączone moduły + zacznij z niego korzystać, możesz się wiele nauczyć.
Wydaje
Nit: heredoc (Unix) nie rozpoznaje przekierowania i potoku, ale domyślnie rozpoznaje podstawienie parametru / zmiennej i podstawienie procesu (zarówno składniki dolara, jak i składnie wsteczne); aby ukryć te, należy użyć ukośnika odwrotnego w danych lub zacytować (co najmniej jeden znak) słowo separatora w wierszu polecenia.
dave_thompson_085
4

> 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.
spust
źródło