2012-06-25 12 views
11

Zawsze nienawidziłem partii i nadal to robię, nawet dla najprostszych rzeczy, które wolę C lub PHP/Perl. Ale tym razem nie mogłem bez niego wyjść, **** westchnienie ****.Partia: Uciekając z ostrożnością

Chciałem przekierować polecenie echo do innego polecenia. Na przykład:

echo example | more 

ale również chciał, aby móc używać znaków specjalnych w Echo części rury:

echo & | more 

Co oczywiście nie działa. Tak więc próbowałem:

echo ^& | more 

Co również nie działa. Następnie przez próbę i błąd znalazłem:

echo ^^^& | more 

i zadziałało. Ale jako zainteresowany programista zastanawiam się, dlaczego. Dlaczego nie działa ^&?

+1

Znalazłem to, może to jest dla ciebie przydatne? http://stackoverflow.com/questions/3813370/how-to-avoid-cmd-exe-interpreting-shell-special-characters-like – JohnP

+1

+1, nawet jeśli niewielkie piękno wszechmocnej partii, lol . Rozumiem, że partia jest niezwykle dziwaczna, niekonsekwentna i niedostatecznie udokumentowana.Ale wtedy myślę, że wyzwaniem jest to, że mam z nim tyle radości :-) – dbenham

+0

@dbenham, czy są jakieś próby dokumentowania składni partii z Windowsa? – Pacerier

Odpowiedz

10

Przyczyna ma związek z tym, w jaki sposób system Windows implementuje rury - Każda strona rury jest wykonywana we własnej powłoce CMD. Twoje polecenie echo ^& | more rzeczywiście próbuje wykonać

C:\Windows\system32\cmd.exe /S /D /c" echo & " 

po lewej i

C:\Windows\system32\cmd.exe /S /D /c" more " 

po prawej stronie. Możesz zobaczyć, dlaczego lewa strona się nie udaje - próbując wywołać echo niezwyciężonego &. Ucieczka została zużyta przez początkową fazę analizowania przed wykonaniem rzeczywistej lewej strony.

Łatwo też zrozumieć, dlaczego Twoje rozwiązanie działa. Po lewej stronie echo ^^^& | more staje

C:\Windows\system32\cmd.exe /S /D /c" echo ^& " 

Istnieje wiele subtelnych komplikacje podczas pracy z rurami systemu Windows. Więcej informacji można znaleźć na stronie Why does delayed expansion fail when inside a piped block of code?. Wybrana odpowiedź zawiera najlepsze informacje, ale zalecam przeczytanie pytania i wszystkich odpowiedzi, aby uzyskać kontekst wybranej odpowiedzi.

+2

+1, za szybko dla mnie i nie ma nic, co mógłbym dodać – jeb

+0

Dziękuję bardzo za pomocną odpowiedź! – Jori

3

Pierwszy ^ ucieka sam znak (sekundy ^) ^ a trzeci ^ wydostaje się &.

Po uruchomieniu polecenia podobnego ECHO ^& | MORE The ^& otrzymuje z & przez powłokę przed wyjście jest rurami do MORE.

Więc po uruchomieniu ECHO ^^^& | MORE, powłoka zastępuje ^^ z ^ i ^& z & a następnie rurami wyjście do MORE.

+3

Twój pierwszy akapit jest dobry na [język-twister] (https://en.wikipedia.org/wiki/Peter_Piper#Lyrics) ... – Pacerier

Powiązane problemy