เหตุใดคำสั่ง Linux wall จะไม่เผยแพร่อาร์กิวเมนต์สตริง


13

ฉันอ่านที่นี่ว่าควรจะทำงานได้ แต่ไม่:

# usage: wall [file]
root@sys:~> mesg
is y

root@sys:~> wall "who's out there"
wall: can't read who's out there.

หากmesgตั้งค่าเป็นyสิ่งที่ทำให้ฉันไม่สามารถออกอากาศสตริงได้ หมายเหตุฉันยืนยันว่าตัวเลือกไฟล์ใช้งานได้:

root@sys:~> wall test
Broadcast Message from root@sys (/dev/pts/1) at 15:23 ... 
Who's out there?

คำตอบ:


21

ปัญหาอยู่ในไวยากรณ์ที่ใช้ในบทความที่เชื่อมโยง เพื่อให้เข้าใจถึงสิ่งที่ผิดพลาดเรามาดูman wallกัน:

การใช้งานจากman wall:

wall [file]

Wall displays the contents of file or, by default, its standard input

ดังนั้นwallยอมรับทั้งสองแหล่งสำหรับข้อความ

อาร์กิวเมนต์ชื่อไฟล์

อาร์กิวเมนต์บรรทัดคำสั่งใด ๆ ที่กำหนดwallให้ต้องเป็นชื่อไฟล์ เนื่องจากไม่มีวิธีที่เชื่อถือได้ที่จะบอกได้ว่าอาร์กิวเมนต์นั้นมีความหมายเป็นข้อความหรือชื่อไฟล์wallจะถือว่าเป็นตัวหลังไม่สนใจสิ่งที่เข้ามาในอินพุตมาตรฐานและลองอ่านข้อความจากไฟล์นั้น

ในกรณีที่กำหนดมันจะพยายามอ่านจากไฟล์who's out thereและไม่พบมัน โปรดทราบว่าการอ่านจากไฟล์มักจะ จำกัด อยู่ที่ superuser หากคุณดำเนินการwall "who's out there"ในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษน่าจะเป็นผลลัพธ์ที่ได้wall: will not read who's out there - use stdin.

อินพุตมาตรฐาน

หากไม่ได้รับอาร์กิวเมนต์ชื่อไฟล์ในบรรทัดคำสั่งมันจะเริ่มอ่านจากอินพุตมาตรฐาน มีหลายวิธีในการฟีดข้อมูลไปยังอินพุตมาตรฐานของคำสั่ง หนึ่งคือการใช้ท่อยูนิกซ์ ไพพ์ไลน์จะเชื่อมต่อเอาต์พุตมาตรฐานของคำสั่ง lefthand-side เข้ากับอินพุตมาตรฐานของคำสั่งด้านขวา:

$ echo "who's out there" | wall

อีกวิธีหนึ่งคือการใช้ที่นี่เอกสาร A here documentเป็นโครงสร้างของเชลล์ที่ส่งผ่านสตริง (จนถึงเครื่องหมายสิ้นสุดที่ระบุบนบรรทัดของตนเอง) โดยตรงไปยังอินพุตมาตรฐานของคำสั่งโดยไม่มีขั้นตอนกลางของการมีคำสั่งที่ชัดเจนสร้างเอาต์พุตนั้น:

$ wall << .
who's out there?
.

นี่จะเป็น "การใช้เอกสารไร้ประโยชน์ที่นี่" โดยค่าเริ่มต้นเทอร์มินัลเองจะเชื่อมต่อกับwallอินพุตมาตรฐานและwallจะเริ่มอ่านจากมันจนกว่าจะได้รับอักขระสิ้นสุดไฟล์ ( Ctrl+D):

$ wall
who's out there?
^D

ตามที่อุดมไปด้วย Homolkaสังเกตเห็นในความคิดเห็นเปลือกบางสนับสนุนhere stringsซึ่งอนุญาตให้ผ่านสตริงตัวอักษรโดยไม่ต้องคำสั่งหรือเครื่องหมายสิ้นสุด:

$ wall <<< "who's out there?"

ทั้งหมดป้อนบางสิ่งบางอย่างให้wallเป็นอินพุตมาตรฐาน ความแตกต่างคือไพพ์ไลน์เชื่อมต่อเอาต์พุตของคำสั่งอื่นไปยังมันในขณะที่here documentsและhere stringsส่งผ่านสตริงโดยตรง ข้อได้เปรียบที่สองของที่นี่คือความสวยงามเนื่องจากechoคำสั่งจากตัวอย่างไปป์เป็นคำสั่งในตัวของเชลล์ดังนั้นมันจะเป็นเชลล์ที่ให้wallอินพุตในทุกกรณี


1
Bash / zsh มีรูปแบบอื่นเพื่อหลีกเลี่ยงecho xxx | yyyไวยากรณ์ซึ่งฉันพบ cludgywall <<<'your message'
Rich Homolka

ฉันไม่แน่ใจเกี่ยวกับที่อุดมไปด้วย - ไวยากรณ์ของผนังไม่ควรเป็นไปตามเปลือกยกเว้นว่ามี. bashrc หรืออะไรก็ตามที่เทียบเท่า zsh ฉันใช้ทุบตีด้วย
mbb

ขอบคุณ peth - นั่นคือองค์กรการสร้างประโยคที่ฉันต้องการเรียนรู้!
mbb

ความผิดพลาดของฉันรวย! ด้วยการชี้แจงของ Peth ตอนนี้ฉันเห็นว่าคุณกำลังเสนอwall <<< stringsintax มันเยี่ยมมาก คุณสองคนสามารถอธิบายสิ่งที่<<<ทำตรง (และทำไมมันจะมีประสิทธิภาพมากขึ้นตามที่ peth พูด)? <<<ฉันคิดว่ามันแปลกที่คำสั่งที่ต้องใช้ไฟล์ที่สามารถยอมรับสตริงหลัง ขอบคุณอีกครั้ง.
mbb

1
@mjb เป็นไปได้ยากที่ herestring นั้นมีประสิทธิภาพมากกว่าเสียงก้อง - herestrings ทำงานโดยการสร้างไฟล์ชั่วคราวแล้วแนบไฟล์นั้นในฐานะ stdin ของกระบวนการ (file descriptor 0) ซึ่งเป็นเหตุผลที่wallยอมรับ (ผนังอ่านจาก stdin ถ้าคุณไม่ ' ไม่ระบุไฟล์) เป็นวิธีการตรวจสอบว่า herestrings สร้างไฟล์ที่จะพิมพ์สิ่งที่ต้องการ$ readlink /proc/self/fd/0 <<< test /tmp/sh-thd-4228536315 (deleted)
Stuart P. Bentley

0

ลองกับรูต

root@username:~# wall /home/username/yourfile_name 

หากไฟล์ของคุณอยู่ในไดเรกทอรีบ้านหรือลองเส้นทางอื่น

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