ความมหัศจรรย์ของ“ -” (เส้นประ) ในพารามิเตอร์บรรทัดคำสั่งคืออะไร?


102

ตัวอย่าง:

  • สร้างอิมเมจ ISO และเบิร์นลงซีดีโดยตรง

    mkisofs -V Photos -r /home/vivek/photos | cdrecord -v dev=/dev/dvdrw -

  • เปลี่ยนเป็นไดเร็กทอรีก่อนหน้า

    cd -

  • ฟังบนพอร์ต 12345 และส่งข้อมูลที่ไม่ตรงไปยังมัน

    nc -l -p 12345 | tar xvzf -

จุดประสงค์ของเส้นประคืออะไรและฉันจะใช้มันได้อย่างไร?

คำตอบ:


113

ถ้าคุณหมายถึง naked -ที่อยู่ท้ายtarคำสั่งนั่นเป็นเรื่องปกติของคำสั่งต่างๆที่ต้องการใช้ไฟล์

ช่วยให้คุณระบุอินพุตหรือเอาต์พุตมาตรฐานแทนที่จะเป็นชื่อไฟล์จริง

นั่นคือกรณีของตัวอย่างแรกและที่สามของคุณ ยกตัวอย่างเช่นcdrecordคำสั่งคือการป้อนข้อมูลมาตรฐาน (สตรีมภาพ ISO ผลิตโดยmkisofs) /dev/dvdrwและการเขียนโดยตรงไปยัง

ด้วยcdคำสั่งทุกครั้งที่คุณเปลี่ยนไดเร็กทอรีจะเก็บไดเร็กทอรีที่คุณมา หากคุณcdใช้-"ชื่อไดเร็กทอรี" แบบพิเศษจะใช้ไดเร็กทอรีที่จำนั้นแทนไดเร็กทอรีจริง คุณสามารถสลับไปมาระหว่างสองไดเรกทอรีได้อย่างรวดเร็วโดยใช้สิ่งนั้น

คำสั่งอื่น ๆ อาจถือว่า-เป็นค่าพิเศษที่แตกต่างกัน


9
โปรดทราบว่าคุณสามารถใช้-สำหรับสาขาคอมไพล์ได้เช่นคุณสามารถเปลี่ยนกลับไปใช้สาขาก่อนหน้าได้ด้วยgit checkout -
snappieT

3
ในเอกสาร tar อธิบายว่าได้รับการสนับสนุนที่ไหน ฉันจะรู้ได้อย่างไรว่าคำสั่งใดรองรับ

1
หากคำสั่งมีความหมายพิเศษสำหรับคำสั่ง-คุณสามารถค้นหาคำอธิบายได้ใน man page
codeforester

su - # ทำเปลือกหอยล็อกอิน
atongsa

ฉันพบคำสั่งเช่นนี้อยากรู้อยากเห็นมาก: tar -cvf - / home | aescrypt -e -p apples -> backup_files.tar.aes ซึ่งเป็น tar -cvf - / home | aescrypt -e -p apples -o backup_files.tar.aes - เพราะท่อถ่าน | ควรทำให้การมีอยู่ของขีดสุดท้ายไม่จำเป็น แต่หากไม่มีขีดสุดท้ายคำสั่งก็ล้มเหลว ฟังดูไร้เหตุผล ใครช่วยกรุณาให้ข้อมูลอ้างอิงที่อธิบายความหมายเส้นประเปล่าในบรรทัดคำสั่ง ฉันไม่พบใด ๆ
elmclose

22

มันไม่ใช่เวทมนตร์ บางคำสั่งแปล-ว่าผู้ใช้ต้องการอ่านจาก stdin หรือเขียนไปที่ stdout ไม่มีอะไรพิเศษเกี่ยวกับเปลือกหอย


9
ยกเว้นในกรณีcd -; bash(1)จัดการเช่นถ้าคุณได้เขียนcd - cd $OLDPWD
sarnold

6
@sarnold แต่ประเด็นก็เหมือนกันcd- คำสั่งในตัวของเชลล์ - ตีความเส้นประเอง ไม่มี "มายากล" :-)

2
@pst แน่ใจว่าไม่มีเวทมนตร์ (มันคือทั้งหมดที่รหัสเพียง :) แต่มีเป็นบางสิ่งที่พิเศษเกี่ยวกับเรื่องนี้ไปยังเปลือก
sarnold

13

การเปลี่ยนเส้นทางจากหรือไปหรือstdinstdout

ดู: http://tldp.org/LDP/abs/html/special-chars.html#DASHREF2


เช่นเคย ABS จะต้องมีเม็ดเกลือ ยกตัวอย่างเช่นมันแสดงให้เห็นว่ามีการเปลี่ยนเส้นทางที่นี่ แต่นี้จะแตกต่างจากผู้ประกอบการเปลี่ยนเส้นทางของเปลือก ( <, >, |ฯลฯ )
tripleee

10

-หมายถึงสิ่งที่แต่ละคำสั่งต้องการให้หมายถึง มีอนุสัญญาทั่วไปหลายฉบับและคุณเคยเห็นตัวอย่างส่วนใหญ่ในคำตอบอื่น ๆ แต่ไม่มีข้อใดเป็นสากล 100%

ไม่มีความมหัศจรรย์ใด ๆ เกี่ยวกับ-ตัวละครเท่าที่เชลล์เกี่ยวข้อง (ยกเว้นเชลล์เองและคำสั่งในตัวบางคำสั่งเช่นcdและechoใช้ในรูปแบบทั่วไป) อักขระบางตัวเช่น\, 'และ", มีความ "ขลัง" มีความหมายพิเศษใดก็ตามที่พวกเขาจะปรากฏ สิ่งเหล่านี้คือ "ตัวแสดงผลเชลล์" -ไม่ใช่อย่างนั้น

หากต้องการดูว่าคำสั่งนั้นใช้-อย่างไรโปรดอ่านเอกสารสำหรับคำสั่งนั้น


7

อาคมอยู่ในอัตภาพ เป็นเวลานับพันปีผู้คนได้ใช้ '-' เพื่อแยกแยะตัวเลือกจากอาร์กิวเมนต์และใช้ '-' ในชื่อไฟล์เพื่อหมายถึง stdin หรือ stdout ตามความเหมาะสม อย่าดูถูกอำนาจของอัตภาพ!


อย่าประเมินความสามารถของผู้คนมากเกินไปในการแยกแยะมารยาทในการพูดจากการแสดงออกตามตัวอักษร สิ่งนี้ไม่ได้เกิดขึ้นเป็นเวลานับพันปี
tripleee

1
@tripleee - จริง แต่มันเกิดขึ้นหลายพันล้านวินาที ;-)
David R Tribble

5

หมายถึงการใช้สตรีมอินพุตมาตรฐานของโปรแกรม

ในกรณีcdนี้หมายถึงสิ่งที่แตกต่าง: เปลี่ยนเป็นไดเร็กทอรีการทำงานก่อนหน้า

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