ฟังก์ชันของเครื่องหมายดอกจันเป็นคำสั่งแบบสแตนด์อโลนใน Unix คืออะไร


21

ฉันสับสนใน terminal ใน Red Hat Linux และเมื่อฉันพิมพ์เครื่องหมายดอกจัน ( *) ตามด้วย return และมันรันหนึ่งในโปรแกรมในไดเรกทอรีของฉัน ทำไม?

การคาดเดาที่ดีที่สุดของฉันคือ Unix ถือว่ามันเป็นสัญลักษณ์แทนดังนั้นจึงเรียกใช้งานโปรแกรมตัวอักษรตัวแรก เนื่องจากmy_program.exeและone_of_my_programs.programสามารถดำเนินการได้โดยเพียงแค่พิมพ์ชื่อของไฟล์ผู้ดำเนินการตัวแทนจะแสดงไฟล์ทั้งหมดที่เป็นไปได้ เนื่องจากโปรแกรมเป็นตัวอักษรตัวแรก, Unix รันมัน นี่เป็นการตัดสินใจที่ถูกต้องหรือไม่?


ฉันคิดว่าไม่ใช่กระสุนทุกตัวที่เรียงลำดับการขยายตัวของ*ตัวอักษร แต่ bash เป็นสิ่งที่ทำ
aschepler

1
@aschepler: เชลล์ที่สอดคล้อง POSIX ทั้งหมดต้อง; ดูpubs.opengroup.org/onlinepubs/9699919799/utilities/ … para 3.
dave_thompson_085

คำตอบ:


20

การตีความของคุณถูกต้อง ส่วนที่เหลือของไฟล์จะถูกนำเสนอเป็นรายการพารามิเตอร์

โปรดทราบว่ามันจะทำเช่นนี้ก็ต่อเมื่อโปรแกรมมีการตั้งค่าบิตที่ใช้งานได้และไดเรกทอรีปัจจุบันอยู่ในPATHรายการ

คู่ของบันทึกย่อที่อาจช่วยให้เข้าใจ: -

  • ถ้าคุณพิมพ์./*แล้วPATHรายการไม่จำเป็นต้อง
  • หากคุณพิมพ์. *หรือ. ./*และไฟล์แรกที่จับคู่เป็นสคริปต์ก็ไม่จำเป็นต้องปฏิบัติการและไม่ต้องการไดเรกทอรีปัจจุบันอยู่ในPATH(อาจไม่เป็นจริงสำหรับเชลล์อื่น ๆ กว่าbash)

10
"มันจะทำสิ่งนี้เท่านั้น ... " - มันน่าสนใจกว่านี้ หากมีฟังก์ชั่นของเชลล์ตัวบิวด์อินหรือไฟล์สั่งการก่อนหน้านี้ในPATHชื่อเดียวกับไฟล์แรกคำสั่งอื่นจะถูกเรียกใช้งาน mkdir foo; cd foo; touch rm xyz; ls; *; ls.
Kamil Maciorowski

จุด Fair - @KamilMaciorowski: คำสั่งของฉัน "มันจะทำเช่นนี้เพียง ..." ระบุจำเป็นเงื่อนไข แต่ไม่เพียงพอคน คำสั่งจะทำงานแตกต่างกันหาก*เป็นนามแฝง
AFH

1
สรุป: อย่าทำอย่างนี้! แม้ว่าคุณคิดว่าคุณสามารถพึ่งพาลำดับตัวอักษรแบบขยายได้ของ glob โปรดทราบว่าลำดับนี้ขึ้นอยู่กับโลแคล
แอรอน

นอกเหนือจาก. *หรือ. ./*หนึ่งสามารถbash *(หรือเชลล์อื่น ๆ )
Olivier Dulac

11

สิ่งนี้ชี้ให้เห็นว่า.เป็นส่วนหนึ่งของPATHตัวแปรของคุณ นี่เป็นแนวคิดที่ไม่ดีอย่างแท้จริงสำหรับเหตุผลด้านความปลอดภัย (โดยปกติ Windows ต้องทำให้เป็นค่าเริ่มต้นที่ไม่สามารถแก้ไขได้)

อย่างไรก็ตาม "คำแนะนำ" นี้ใช้ได้เพียงเล็กน้อยเท่านั้น: หากคุณมีไฟล์ชื่อrmในไดเรกทอรีปัจจุบันของคุณ*จะทำการดำเนินการเริ่มต้น rm :

/tmp$ mkdir ohno
/tmp$ cd ohno
/tmp/ohno$ 
/tmp/ohno$ ls
/tmp/ohno$ touch rm what
/tmp/ohno$ ls
rm  what
/tmp/ohno$ *
/tmp/ohno$ ls
rm
/tmp/ohno$ 

ที่คุณสามารถดูมันไม่ได้rmในไดเรกทอรีปัจจุบัน (ไฟล์ที่ว่างเปล่าและไม่ใช่ปฏิบัติการ) ที่ได้ดำเนินการ /bin/rmแต่เริ่มต้นของระบบ

ตรวจสอบคำสั่งของคุณทุกครั้งเมื่อมีการใช้สัญลักษณ์แทน นี่คือหนึ่งในข้อความที่น่ากลัวที่สุดที่เคยอ่าน:

rm: cannot remove '.o': No such file or directory

นี่คือผลลัพธ์ของการโทร

rm * .o

มากหรือน้อยตำแหน่งที่แย่ที่สุดของอวกาศปลอมสามารถเกิดขึ้นได้


1
มันไม่เจ็บที่จะสร้างฟังก์ชั่นrm()ที่เพิ่ม-iไปยังพารามิเตอร์หรือตรวจสอบพารามิเตอร์และขอการยืนยันว่ามีมากกว่าจำนวนที่แน่นอน
AFH

3
+1 สำหรับ "นี่คือหนึ่งในข้อความที่น่ากลัวที่สุดที่เคยอ่าน"
Mehrdad

+1 สำหรับ "นั่นเป็นแนวคิดที่ไม่ดีอย่างแท้จริงสำหรับเหตุผลด้านความปลอดภัย (โดยปกติ Windows ต้องทำให้เป็นค่าเริ่มต้นที่ไม่สามารถแก้ไขได้)"
Duncan X Simpson


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