GLOBIGNORE ทำงานอย่างไร


15

ตามหน้าคู่มือของ bash:

   GLOBIGNORE
          A colon-separated list of patterns defining the set of filenames
          to be ignored by pathname expansion.  If a filename matched by a
          pathname  expansion  pattern also matches one of the patterns in
          GLOBIGNORE, it is removed from the list of matches.

อย่างไรก็ตามในทางปฏิบัติ ...

$ bash --noprofile --norc
bash-4.2$ touch .bar
bash-4.2$ echo .*
. .. .bar
bash-4.2$ GLOBIGNORE=.
bash-4.2$ echo .*
.bar

ทำไม..ลบออกจากรายการการแข่งขัน? เท่าที่ฉันรู้รูปแบบ .ไม่ตรงกัน..ใช่หรือไม่

คำตอบ:


14

เลื่อนลง ...

ชื่อไฟล์.และ..จะถูกละเว้นเสมอเมื่อGLOBIGNOREตั้งค่าและไม่ว่าง

ส่วนใหญ่แล้วจะไม่ต้องการรวม.และ..ตรงกับสัญลักษณ์แทนเนื่องจากไม่ได้แสดงไฟล์ในไดเรกทอรี - พวกเขากำลังแฮ็กเพื่อให้การนำทางไดเรกทอรีทำงาน ความจริงแล้วที่มาของไฟล์ดอทนั้นเป็นจุดบกพร่องในlsคำสั่งเวอร์ชันแรกๆ ผู้เขียนตั้งใจจะแยก.และ..ออกจากรายชื่อ แต่ไม่รวมไฟล์ทั้งหมดที่ขึ้นต้นด้วยโดย.ไม่ตั้งใจ ดังนั้นไฟล์ dot lsกลายเป็นที่ซ่อนอยู่จาก lsเปลือกหอยตามเหมาะสมโดยการซ่อนไฟล์จุดเช่น อย่างไรก็ตามวิธีการทำเช่นนี้เป็นการแฮ็คอีกครั้ง: ไฟล์ที่ขึ้นต้นด้วย.จะถูกแยกออกเฉพาะในกรณีที่จุดไม่ได้ถูกจับคู่อย่างชัดเจนในรูปแบบ ดังนั้นรูปแบบ.*รวมและ...

เพื่อรักษาความเข้ากันได้กับสคริปต์ที่มีอยู่เปลือกหอยที่ทันสมัยยังคงรวม.และ..(ยกเว้น zsh ซึ่งในปัญหานี้เหมือนคนอื่น ๆ หลายคนมี saner แต่พฤติกรรมที่เข้ากันได้ย้อนหลัง) อย่างไรก็ตามหากคุณตั้งค่าGLOBIGNOREคุณกำลังใช้คุณสมบัติเฉพาะของ bash ซึ่งแสดงว่าคุณไม่สนใจความเข้ากันได้แบบย้อนหลัง ดังนั้นการจับคู่รูปแบบจึงเปลี่ยนเพื่อแยก.และ..ออกจากการจับคู่รูปแบบทั้งหมด

การตั้งค่าจะGLOBIGNORE=.แยกไฟล์ที่ถูกแยกออกโดยอัตโนมัติอย่างไรก็ตามเมื่อใดก็ตามที่GLOBIGNOREมีการตั้งค่าดังนั้นจึงมีค่าเท่ากับshopt -s dotglobยกเว้น.และ..นอกจากนั้นจะถูกแยกออกจากทุกรูปแบบ


1
ที่จริงแล้วฉันเพิ่งรู้ว่าการตั้งค่าGLOBIGNOREไม่สนใจ.และ..ในรูปแบบสแลชน้อยและ GLOBIGNORE กรองเส้นทางไฟล์ไม่ใช่ชื่อไฟล์ GLOBIGNORE=.; echo .*จะไม่รวม.หรือ..แต่จะGLOBIGNORE=.; echo ./.*(หรือecho /bin/.*)! ที่จะไม่สนใจ.และ..จาก globs ทั้งหมดมันดูเหมือนว่าคุณต้องการและshopt -s extglob GLOBIGNORE='?(*/)@(.|..)'
Stéphane Chazelas

1
ที่จริงแล้วไม่มีGLOBIGNORE='?(*/)@(.|..)'จะล้มเหลวในการยกเว้น.และใน.. จะทำลาย globs เช่น....*/fooGLOBIGNORE='?(*/)@(.|..)?(/*)'./*
Stéphane Chazelas

3

จากส่วนชื่อ "การขยายชื่อเส้นทาง" ในman bash:

ชื่อไฟล์ ''. '' และ '' .. '' จะถูกละเว้นเสมอเมื่อตั้งค่า GLOBIGNORE และไม่เป็นโมฆะ

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