ฉันจะส่งตัวอักษรไปยังคำสั่งราวกับว่าพวกเขามาจากไฟล์ได้อย่างไร
ตัวอย่างเช่นฉันพยายาม:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
ฉันจะส่งตัวอักษรไปยังคำสั่งราวกับว่าพวกเขามาจากไฟล์ได้อย่างไร
ตัวอย่างเช่นฉันพยายาม:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
คำตอบ:
ในเปลือกหอยที่สนับสนุนที่นี่สตริงรวมทั้งbash
, zsh
และksh93
คุณสามารถใช้
wc <<< "apple pear orange"
อีกสองวิธี (ซึ่งอนุญาตให้ใช้อินพุตแบบหลายบรรทัดโดยไม่มีความพยายามพิเศษ):
ใช้ "เอกสารที่นี่":
$ wc << EOF ลูกแพร์แอปเปิ้ลส้ม EOF 1 3 18 $
EOF
สตริงเป็นตัวคั่น คุณสามารถใช้สตริงใดก็ได้ EOF
เป็นเพียงทางเลือกทั่วไป
ใช้ tty เป็นอินพุต:
$ wc ลูกแพร์แอปเปิ้ลส้ม Ctrl+D 1 3 18 $
นี่เป็นข้อเสียเปรียบที่โปรแกรมเริ่มทำงานและเริ่มอ่านอินพุตทันทีที่คุณพิมพ์ชื่อ สิ่งนี้อาจทำให้สับสนได้ ตัวอย่างเช่น:
$ grep v สุนัขจิ้งจอกสีน้ำตาลด่วน (พิมพ์) กระโดดข้าม (พิมพ์) กระโดดข้าม (นี่คือผลลัพธ์จาก grep!) สุนัขขี้เกียจ (พิมพ์) Ctrl + D (ไม่มีผลลัพธ์ที่นี่) $
<<<
ฟอร์มยังอนุญาตให้อินพุตแบบหลายบรรทัดโดยไม่ต้องใช้ความพยายามเป็นพิเศษเนื่องจาก"
สตริง -enclosed สามารถมีการขึ้นบรรทัดใหม่ แน่นอน<< EOF
รูปแบบ (ไวยากรณ์ here-doc ดั้งเดิม) อ่านได้ง่ายกว่าถ้าคุณมีอินพุตหลายบรรทัด
<<<
word
- แน่นอนในบริบทของเปลือก, a word
สามารถเป็นสตริงที่ยกมามีช่องว่างและขึ้นบรรทัดใหม่! D'โอ้! เห็นได้ชัดว่ามันไปโดยไม่บอก (และอันที่จริงแล้วฉันไม่เห็นมันพูดถึงใน man page เลย) :-( ขอบคุณที่บอกให้ฉันทราบ!
word
ถูกกำหนดใน manpage เป็น "ลำดับของอักขระที่ถือว่าเป็นหน่วยเดียวโดยเชลล์" (aka "token") และคุณจำเป็นต้องรู้ว่าสตริงที่ยกมานั้นจะถือว่าเป็น "a single unit" ในแง่ที่เกี่ยวข้อง (หลังจาก ทับขวาประมวลผลการขยายตัวตัวแปรอื่น ๆ" แต่แน่นอนว่าเป็นวัตถุประสงค์ทั้งสองครั้ง quoting ในเปลือก (ราคาเดียวยังป้องกันจากการขยาย.) รูปแบบการประมวลผลของเปลือกเป็นความคิดที่ดีมากออกและอะไร แต่ง่าย..
<()
แม้ว่าจะมีการแก้ปัญหาที่ถูกต้องที่นี่หลายไวยากรณ์อื่นที่สามารถเป็นบางครั้งที่มีประโยชน์คือการใช้คำสั่งใน สิ่งนี้จะอนุญาตให้คุณสร้างวัตถุ file-descriptor มากกว่า 1 อันในบรรทัดคำสั่ง
สิ่งนี้มีประโยชน์เมื่อคุณกำลังทำอะไรบางอย่างเช่นการเปรียบเทียบสตริงข้อความที่มีความยาวหรือถ้าคุณต้องการกระจายเนื้อหาบางส่วนที่ไม่ได้อยู่ในไฟล์
ตัวอย่างเช่นการเปรียบเทียบไฟล์โฮสต์บนสองโหนดโดยไม่ต้องคัดลอกไฟล์โฮสต์ไปยัง localhost:
diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')
การ<
เปลี่ยนเส้นทางไฟล์ไปยัง STDIN และ()
สร้าง subshell เพื่อเรียกใช้คำสั่งระหว่างวงเล็บ มันคือ STDOUT จาก subshell ที่ส่งผ่านไปยัง STDIN ของคำสั่งที่กำลังรัน
มันเป็นวิธีที่ง่ายกว่าในการสร้างไฟล์ "input" มากกว่าหนึ่งคำสั่งแทนที่จะพยายามใช้หลาย ๆ เอกสารที่นี่หรือพยายาม echo หลายคำสั่งไปยังไพพ์ไลน์
<fileorpathname
เปลี่ยนเส้นทาง stdin แต่<(subcmd)
ไม่; มันทดแทนชื่อที่เมื่อ / ถ้าเปิดโดยโปรแกรมสามารถอ่าน stdout จาก subcmd < <(subcmd)
(พื้นที่ที่จำเป็น) ไม่ stdin subcmd |
เปลี่ยนเส้นทางจากไฟล์ที่เกือบจะเหมือน คุณdiff
สามารถอ่านหนึ่งในอินพุตของมันจาก stdin โดยการระบุอาร์กิวเมนต์ของ-
แต่ไม่ใช่ทั้งคู่
cmd <(cmd2 ...)
cmd < <(cmd2 ...)
อดีตอนุญาตให้ใช้ข้อมูลที่ได้รับมา (เอาต์พุตของ cmd2) เพื่อใช้แทนชื่อไฟล์ cmd2 ... | cmd
หลังเป็นเทียบเท่ากับ คำสั่งต้องถูกเขียนเพื่อยอมรับอินพุต stdin อย่างชัดเจนและหลายคำสั่งไม่ใช่ นี่เป็นความจริงโดยเฉพาะอย่างยิ่งของเชลล์สคริปต์
คุณสามารถใช้ท่อ
echo "apple pear orange" | wc
คุณอาจต้องการใช้สิ่งที่คล้ายกับที่คาดหวัง ต่อไปนี้เป็นตัวอย่างง่าย ๆ ของการเปิดเซสชัน telnet ระยะไกลรอการพร้อมท์ส่งข้อมูลบางอย่างรอการตอบสนองสลีปและออก
#!/usr/bin/expect
spawn telnet localhost 8555
expect "Escape character is '^]'."
send "Hello World\n"
expect "Connection closed by foreign host."
sleep 1