วิธีใช้“ <<” ในแบตช์ไฟล์หรือพรอมต์คำสั่ง?


13

ฉันรู้ว่าสิ่งที่>>ใช้มันเขียนข้อความทั้งหมดลงในไฟล์แทนที่จะเป็นหน้าจอ และฉันคิดว่า<<จะย้อนกลับฉันลองและได้รับข้อความ:<< was unexpected at this time.

กรุณาบอกฉันว่าสิ่งที่<<ใช้และวิธีการใช้

คำตอบ:


17

เชลล์คำสั่งมาตรฐานของ Windows - cmd.exe- ไม่ใช้<<โอเปอเรเตอร์เลย ¹

ซิงเกิล<หมายถึง "อ่านไฟล์ในอินพุตมาตรฐาน " ถึงcmd.exeแต่<อักขระสองตัวแบ็คอัพกลับไม่มีความหมายcmd.exeดังนั้นจึงทำให้เกิดข้อผิดพลาดที่คุณได้รับ

<<ผู้ประกอบการเป็นที่มีความหมายกับทุกประเภทที่สำคัญของระบบปฏิบัติการยูนิกซ์เชลล์คำสั่งที่จะใช้สำหรับที่นี่เอกสาร : ²

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

ทั้งสามบรรทัดถูกส่งไปยังsome-commandอินพุตมาตรฐาน

สิ่งนี้มีประโยชน์สำหรับการส่งข้อความจำนวนมากไปยังคำสั่งโดยไม่ต้องเขียนลงในไฟล์ก่อนเนื่องจากคุณต้องใช้<โอเปอเรเตอร์ ฉันมักจะใช้มันเพื่อฝังข้อความ "การใช้งาน" ลงในสคริปต์:

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

สิ่งนี้ดีกว่าการเขียนechoข้อความจำนวนมากเนื่องจากข้อความในรูปแบบ heredoc นั้นถูกจัดรูปแบบเหมือนกับพิมพ์ลงบนหน้าจอ นอกจากนี้ยังง่ายต่อการจัดการกับพื้นที่สีขาวการอ้างอิงการเปลี่ยนเส้นทางและการแก้ไขตัวแปรในบริบทนี้ ตัวอย่างเช่นฉันได้ใช้วงเล็บมุมในข้อความการใช้งานโดยไม่ต้องทำอะไรที่ชาญฉลาดเพื่อป้องกันไม่ให้เชลล์พยายามใช้มันสำหรับการเปลี่ยนเส้นทาง I / O

หากคุณต้องการทำสิ่งนี้บน Windows คุณสามารถติดตั้งCygwinและใช้เชลล์ตัวใดตัวหนึ่งได้ หากคุณใช้ Windows 10 คุณสามารถใช้WSLแทน


เชิงอรรถ:

  1. ลิงค์นั้นจะเข้าสู่แผนผังเอกสาร Windows XP ที่เก็บถาวร Microsoft ได้ทำลายลิงก์ที่ฉันเคยใช้เมื่อพวกเขาเก็บถาวรเอกสารเหล่านี้ดังนั้นในกรณีที่พวกเขาทำแตกอีกครั้งนี่เป็นข้อมูลอ้างอิงบุคคลที่สามสำรอง

    cmd.exeวัสดุอ้างอิงอื่น ๆที่ฉันทราบใน microsoft.com คือคำสั่ง Windows PDF (4.9 MB, 948 หน้า) ซึ่งทำหน้าที่ได้มากกว่าการอ้างอิงสำหรับคำสั่งภายนอกส่วนใหญ่ (!) ในตัวและ Microsoft ให้มา คุณสามารถให้ได้ในcmdทันที PDF นี้ไม่สมบูรณ์ในสองฐาน ก่อนอื่นและที่เกี่ยวข้องมากที่สุดที่นี่ไม่มีการพูดคุยกันถึงวิธีการเปลี่ยนเส้นทางในcmd.exeเชลล์ ไม่มีแม้แต่การอภิปรายเกี่ยวกับไวยากรณ์เชลล์ ประการที่สองรายการคำสั่งไฟล์ PDF ไม่สมบูรณ์: diskpartสิ่งแรกที่ผมเกิดขึ้นกับการตรวจสอบจะไม่ครอบคลุมถึง:

    ฉันเชื่อว่าสิ่งเหล่านี้ทั้งหมดเกิดจากความพยายามอย่างชัดเจนของ Microsoft ในการแทนที่cmd.exeด้วยPowerShellซึ่งดำเนินการมาหลายปีแล้ว ในการอัปเดตล่าสุดของ Windows 10 เนื่องจากการเขียนนี้พวกเขาได้ดำเนินการขั้นตอนเพิ่มเติมเพื่อซ่อนการมีอยู่ของcmd.exeแม้ว่ามันจะยังไม่หายไปโดยสิ้นเชิง

    มันเป็นที่น่าสังเกตว่าPowerShell ยังไม่ได้รับการสนับสนุนจาก<<ผู้ประกอบการเปลี่ยนเส้นทาง หรือในการถดถอยที่น่าเศร้าจากทั้ง Unix shells และcmd.exe- มันรองรับการ<เปลี่ยนเส้นทางหรือไม่!

  2. วิธีบัญญัติของการเริ่มต้นที่นี่เอกสารเป็นเหมือนที่ฉันได้เขียนไว้ข้างต้นโดยไม่มีช่องว่างระหว่างคำ<<และตัวคั่น ความทรงจำที่คลุมเครือของฉันคือการใช้เอกสารที่นี่ทั้งหมดที่ฉันเคยเห็นในเชลล์สคริปส์ก็ทำได้เช่นกัน ข้อกำหนด POSIX สำหรับเอกสารที่นี่ยังใช้สไตล์นี้ในตัวอย่าง

    อย่างไรก็ตามการอ่านอย่างละเอียดเกี่ยวกับส่วนอื่น ๆ ของข้อมูลจำเพาะ POSIX.1-2008แสดงให้เห็นว่าการใส่อักขระช่องว่างหรืออักขระแท็บระหว่างคำ<<และตัวคั่นจำนวนถูกต้องตามกฎหมาย โดยเฉพาะอย่างยิ่งเห็นการรับรู้กฎโทเค็น 7 และ 10 , นิยามของio_hereในไวยากรณ์เปลือกและความหมายของ"ความว่างเปล่า" ตัวละครคลาส

    นั่นคือวิธีที่คุณจัดทำเอกสารเชลล์ จดบันทึก Microsoft ;)

    ทดสอบที่นี่ใน Bash 4 และksh93ยืนยันว่าทำงานได้ตามที่คาดไว้


ไม่สามารถพูดได้ดีกว่านี้ ยกเว้นฉันจะไม่ได้กล่าวถึง Cygwin เพราะมีบางสิ่งที่คุณทำใน Windows และอื่น ๆ ที่คุณทำกับ Unix มีความเข้ากันได้ข้ามหลายอย่างใช่ แต่ฉันขอแนะนำอย่างยิ่งให้เพียงแค่เรียนรู้ยูนิกซ์แบบดิบๆแทนที่จะใช้งานเวอร์ชวลรอบ ๆ เช่น Cygwin หรือยูทิลิตี้ที่ใช้ Win อื่น ๆ
BiTinerary

8
@BiTinerary: เนื่องจากผู้คนจำนวนมากใช้ Cygwin ทุกวันโดยเฉพาะเพื่อให้สามารถทำสิ่งที่คล้าย Unix บน Windows ได้ฉันคิดว่าฉันจะทิ้งคำใบ้ไว้ในคำตอบ
Warren Young

ใช่ฉันไม่ได้ตั้งใจที่จะลดทอนความถูกต้องที่เป็น Cygwin นรกที่ฉันใช้สำหรับงานทางโลกในตอนนี้และหลังจากนั้น ฉันแค่ใส่สองเซ็นต์ของฉันที่กำลังบูทของจริงและเรียนรู้ว่า (โดยเฉพาะอย่างยิ่งสำหรับผู้เริ่มต้น) ดีกว่าการเรียนรู้บางสิ่งจากบุคคลที่สามหรือแยกออกจากต้นฉบับที่ต้องสอดคล้องกับระบบปฏิบัติการที่แตกต่างกันโดยสิ้นเชิง ฉันแค่อยากจะบอกว่าในระยะเวลาที่ใช้ในการตั้งค่า Cygwin ให้ระบุโมดูลที่รวมอยู่ทั้งหมด + เริ่มใช้มันคุณจะได้เรียนรู้มากมายในสิ่งจริง ฉันรู้สึกว่า Cygwin เป็นสิ่งที่คุณใช้หลังจากที่ทำเสร็จแล้วและไม่ต้องการรีบูต
BiTinerary

Nit: (Unix) heredoc ไม่รู้จักการเปลี่ยนเส้นทางและไปป์ แต่ตามค่าเริ่มต้น DOES จะรับรู้การทดแทนพารามิเตอร์ / ตัวแปรและการทดแทนกระบวนการ (ทั้งดอลลาร์ Parens และไวยากรณ์ backticks); เพื่อยับยั้งการใช้แบ็กสแลชในข้อมูลหรือเครื่องหมายคำพูด (อย่างน้อยหนึ่งอักขระของ) คำตัวคั่นบนบรรทัดคำสั่ง
dave_thompson_085


4

> เขียนไปยังไฟล์ใหม่

>> ต่อท้ายไฟล์

< อ่านจากไฟล์

| ส่งคำสั่งเอาต์พุตไปยังอินพุตของคำสั่งอื่น

ดูที่นี่เพื่อดูรายการพิมพ์% ^ ไปที่ cmd.exe หรือไข่อีสเตอร์ของ Windows หรือไม่

ตั้งแต่ที่ถูกโพสต์นี้ได้รับการเพิ่ม

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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.