ตัวบ่งชี้โทเค็นของ `]` คืออะไร?


9

คู่มือทุบตีพูดว่า:

เมื่อใช้ [แบบฟอร์มอาร์กิวเมนต์สุดท้ายของคำสั่งจะต้องเป็น]

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

ดังนั้นจึง]ไม่ใช่คำที่สงวนไว้และไม่เป็นตัวดำเนินการหรือเป็นคำสั่งในตัว

ในฐานะโทเค็นตัวระบุโทเค็น]คืออะไร คำหรือชื่อ?


4
ที่จริงแล้ว[คือ (ด้วย) คำสั่งแบบใช้ตัวเอง: -rwxr-xr-x 1 รูทราก 39552 3 ธ.ค. 18:14 / usr / bin / [แม้ว่ามันจะเป็นไปได้ยังมี "ขนาน" ในตัวเหมือนมีไว้สำหรับ killเช่น ในบางระบบtestคำสั่งคือลิงก์สัญลักษณ์ไป[หรือกลับกัน AFAIK ]ไม่ได้มีความหมายอะไรเลย แต่ได้รับการยอมรับว่า "ปิด" a [- แต่มันมีเหตุผลมากกว่าสำหรับ "สุนทรียศาสตร์"
Baard Kopperud

5
ภาษาของเชลล์นั้นเติบโตขึ้นทีละเลเยอร์ในช่วง 46 ปีที่ผ่านมาและความมั่นคงภายในก็ไม่สำคัญ หากคุณพยายามบังคับให้มันเข้ากับกรอบของภาษาทางการเชิงทฤษฎีคุณจะมีช่วงเวลาที่เลวร้าย
zwol

เนื่องจาก[เป็น (เช่น) คำสั่งในตัวเองจึงมักจะมี man-page ... ดังนั้นลองman [และ / หรือman test( [และtestอาจเป็นคำสั่งเดียวกัน)
Baard Kopperud

ลองติด]เครื่องหมายคำพูดเดี่ยวหรือคู่แล้วคุณจะเห็นว่ามันไม่ต่างอะไร มันเป็นเพียงแค่สตริง
Wildcard

คำตอบ:


21

]เติมเต็ม[มันเป็นสัญญาณปิดของ[คำสั่ง

เมื่อmanหน้าชี้ไปนี่เป็นข้อโต้แย้งจริง ๆ[แต่[เกิดขึ้นกับมันโดยเฉพาะเมื่อจบ

คุณสามารถมีลักษณะคล้ายกับรูปแบบบางปิดคำสั่งอื่น ๆ เช่นใน;find .. exec


ขอบคุณ โทเค็นประเภท / ตัวระบุ]คืออะไร
ทิม

8
@Tim ]ไม่แตกต่างจากอักขระปกติอื่น ๆ ในบริบทนี้ (เป็นอาร์กิวเมนต์ของคำสั่ง) testคำสั่งถือว่ามันเป็นพิเศษ แต่ที่ขึ้นอยู่กับคำสั่ง
muru

6
มันเป็นเพียงสตริงและก่อให้เกิดข้อผิดพลาดถ้าอาร์กิวเมนต์สุดท้ายของมันไม่ได้เท่ากับ[ ]
chepner

19

Bash ไม่ได้ปฏิบัติต่อ[หรือ]ตัวละคร (ของตัวเอง) ใด ๆ ที่แตกต่างจากตัวอักษรของตัวอักษร

ในกรณีนี้ bash จะเห็นคำว่า "word" [และไปหาคำสั่งที่มีชื่อนั้น หากคุณดูในระบบไฟล์ของคุณคุณอาจพบว่า/bin/[(หรือ/usr/bin/[) มีอยู่ในรูปแบบของไฟล์เรียกทำงาน ในขณะที่มันเกิดขึ้นทุบตียังให้รุ่นในตัว (เพื่อประสิทธิภาพ) แต่นั่นเป็นเพียงรายละเอียดการใช้งาน

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

ความจริงที่ว่าเหล่านี้จะไม่ได้เป็นพิเศษคือเหตุผลที่คุณไม่สามารถละเว้นพื้นที่สีขาวก่อนและหลังหรือ[]


ข้อยกเว้น :

  • เมื่อใด[และ]เกิดขึ้นในรูปแบบที่ถูกต้องภายในคำเดียวกันเช่น[a-z]นั้นเป็นกฎพิเศษและกฎการปัดเศษของ bash จะถูกนำมาใช้
  • [[คำสั่งเป็นพิเศษและสามารถทำหลายสิ่งหลายอย่าง[ไม่สามารถ (และพารามิเตอร์ภายใน[[ .. ]]มีการประมวลผลที่แตกต่างกันเช่นเดียวกับบางบรรทัด) ที่เกี่ยวข้อง]]ยังเป็นพิเศษเนื่องจากเป็นคำสงวนเชลล์ที่ไม่สามารถเป็นชื่อคำสั่งและยุติการประมวลผลพิเศษที่ตามหลัง[[คำสำคัญ

1
@JacobKrall ไม่ใช่ตัวละครพิเศษที่ชอบ;หรือ>เป็นเพียงคำสั่งในcdตัว โดยเฉพาะอย่างยิ่งถ้าคุณพิมพ์[xสิ่ง[นั้นไม่มีความหมายพิเศษ
Barmar

2
@JacobKrall นั่นเป็นจริงสำหรับคำสั่งในตัวทั้งหมด [เป็นพิเศษคำสั่งก็ไม่ได้พิเศษของตัวละคร
Barmar

@Barmar: ยุติธรรมเพียงพอ; ฉันดึงความคิดเห็นของฉัน
Jacob Krall

ที่จริงเป็นพิเศษกว่า]] ]เมื่อใช้[และ]เป็นเพียงคำพูด หากคุณละเว้น]หรือแทนที่ด้วยคำอื่น bash จะยังคงทำงานอยู่[แต่[จะสร้างข้อผิดพลาด อย่างไรก็ตาม[[และ]]ได้รับการปฏิบัติพิเศษในเวลาการแยก หากคุณแทนที่]]ด้วยอย่างอื่นทุบตีจะรายงานข้อผิดพลาดทางไวยากรณ์ และถ้าคุณมองข้ามทุบตีจะเก็บแยกบรรทัดถัดไปที่กำลังมองหา]] ]]
kasperd

@ คำตอบ kasperd ถูกปรับแล้ว
ams

3

เพื่อให้ง่ายกว่าคำตอบสองข้อก่อนหน้านี้]เป็นเพียงสตริงที่[ต้องใช้


1
ดูเหมือนว่าจะเป็นความคิดเห็นเล็กน้อย ...
wizzwizz4

@ wizzwizz4 เนื่องจากคำถามติดตามจาก OP ในความคิดเห็นฉันคิดว่าความเรียบง่ายนี้เป็นสิ่งที่เขาต้องการ
Wildcard

@ Wildcard ฉันเห็นด้วยจริง มีบางอย่างที่ดึงดูดให้ฉันเลิกโหวตคำตอบนี้ แต่ฉันคิดว่ามันมีคุณภาพต่ำ (ไม่ได้ลงคะแนนเลย!) ฉันจะแก้ไขเพื่อปรับปรุงมาร์กอัป
wizzwizz4
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.