มีวิธีใดบ้างที่โปรแกรมบรรทัดคำสั่งคอมไพล์จะบอก bash หรือ csh ว่าไม่ต้องการให้อักขระตัวแทนใด ๆ ในพารามิเตอร์ขยาย
ตัวอย่างเช่นอาจต้องการคำสั่งเชลล์เช่น:
foo *
เพื่อส่งคืนค่า ASCII ที่เป็นตัวเลขของอักขระนั้น
มีวิธีใดบ้างที่โปรแกรมบรรทัดคำสั่งคอมไพล์จะบอก bash หรือ csh ว่าไม่ต้องการให้อักขระตัวแทนใด ๆ ในพารามิเตอร์ขยาย
ตัวอย่างเช่นอาจต้องการคำสั่งเชลล์เช่น:
foo *
เพื่อส่งคืนค่า ASCII ที่เป็นตัวเลขของอักขระนั้น
คำตอบ:
ไม่การขยายเกิดขึ้นก่อนที่คำสั่งจะรันจริง
คุณสามารถปิดใช้งาน glob ก่อนที่จะเรียกใช้คำสั่งหรือโดยอ้างถึงดาว
$ # quote it
$ foo '*'
$ # or escape it
$ foo \*
$ # or disable the glob (noglob)
$ set -f
$ foo *
$ # alternative to set -f
$ set -o noglob
$ # undo it by
$ set +o noglob
nullglob
ปิดใช้งานตัวเลือกเชลล์คำนั้นจะไม่เปลี่ยนแปลงหากnullglob
ตั้งค่าตัวเลือกและไม่พบคำที่ตรงกัน
set -f
? มันคือunset -f
อะไร?
set +f
แม้ว่าจะเป็นความจริง แต่คำสั่งเองก็ไม่สามารถปิด globbing ได้ แต่ก็เป็นไปได้ที่ผู้ใช้จะบอก Unix shell ไม่ให้ glob คำสั่งเฉพาะ โดยปกติจะทำได้โดยการแก้ไขไฟล์คอนฟิกูเรชันของเชลล์ สมมติว่าfoo
สามารถพบคำสั่งได้ตามเส้นทางคำสั่งจำเป็นต้องเพิ่มสิ่งต่อไปนี้ในไฟล์คอนฟิกูเรชันที่เหมาะสม:
สำหรับเปลือก sh, bash และ ksh:
alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
สำหรับเชลล์ csh และ tcsh:
alias foo 'set noglob;\foo \!*;unset noglob'
สำหรับ zsh เชลล์:
alias foo='noglob foo'
ไม่จำเป็นต้องใช้พา ธ คำสั่ง พูดว่าคำสั่ง foo ถูกเก็บไว้ในไดเร็กทอรี ~ / bin จากนั้นด้านบนจะกลายเป็น:
สำหรับเปลือก sh, bash และ ksh:
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
สำหรับเชลล์ csh และ tcsh:
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
สำหรับ zsh เชลล์:
alias foo='noglob ~/bin/foo'
ทั้งหมดข้างต้นได้รับการทดสอบโดยใช้ OSX 10.9.2 ของ Apple หมายเหตุ: เมื่อคัดลอกโค้ดด้านบนโปรดระมัดระวังการลบช่องว่างใด ๆ อาจมีความสำคัญ
ผู้ใช้geiraได้ชี้ให้เห็นว่าในกรณีของ bash shell
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
สามารถแทนที่ด้วย
reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;}
alias foo='set -f;reset_expansion ~/bin/foo'
ซึ่งไม่จำเป็นต้องใช้ฟังก์ชัน foo
บางเว็บไซต์ที่ใช้สร้างเอกสารนี้:
การขยายดำเนินการโดยเชลล์ก่อนที่โปรแกรมของคุณจะรัน โปรแกรมของคุณไม่มีเบาะแสว่ามีการขยายเกิดขึ้นหรือไม่
set -o noglob
จะปิดการขยายในเชลล์ที่เรียกใช้ แต่คุณต้องทำก่อนที่จะเรียกใช้โปรแกรมของคุณ
อีกทางเลือกหนึ่งคือการอ้างข้อโต้แย้งของคุณเช่น
foo "*"
set -o noglob
เพื่อปิดใช้งานการขยายสัญลักษณ์แทน
ระวัง: หากไม่มีชื่อที่ตรงกับมาสก์ bash จะส่งอาร์กิวเมนต์ตามที่เป็นอยู่โดยไม่ต้องขยาย!
Proof (pa.py เป็นสคริปต์ที่ง่ายมากซึ่งเพียงแค่พิมพ์อาร์กิวเมนต์):
$ ls
f1.cc f2.cc pa.py
$ ./pa.py *.cc
['./pa.py', 'f1.cc', 'f2.cc']
$ ./pa.py *.cpp
['./pa.py', '*.cpp']
set -o nullglob
หรือshopt -s failglob
และพฤติกรรมนี้จะเปลี่ยนไป (ในสองวิธีที่แตกต่างกันมาก)
pwd
,echo *
เป็นเพียง*