มีเป็นคำถามที่คล้ายกันที่เกี่ยวข้องกับ 'ตัด' สถานการณ์ที่คุณต้องการแทนที่เช่นcd
มีคำสั่งที่เรียกใช้ cd
builtin
อย่างไรก็ตามในแง่ของ shellshock et al และเมื่อรู้ว่าทุบตีนำเข้าฟังก์ชั่นจากสภาพแวดล้อมฉันได้ทำการทดสอบสองสามครั้งและฉันไม่สามารถหาวิธีโทรหา builtin ได้อย่างปลอดภัยcd
จากสคริปต์ของฉัน
พิจารณาสิ่งนี้
cd() { echo "muahaha"; }
export -f cd
สคริปต์ใด ๆ ที่ถูกเรียกใช้ในสภาพแวดล้อมนี้cd
จะใช้งานไม่ได้(พิจารณาถึงผลกระทบของสิ่งที่ชอบcd dir && rm -rf .
)
มีคำสั่งให้ตรวจสอบประเภทของคำสั่ง (เรียกว่าสะดวกtype
) และคำสั่งสำหรับการดำเนินการรุ่น builtin แทนที่จะเป็นฟังก์ชั่น ( builtin
และcommand
) แต่แท้จริงและดูเถิดสิ่งเหล่านี้สามารถถูกแทนที่ด้วยการใช้ฟังก์ชั่นเช่นกัน
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
จะให้ผลดังนี้:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
มีวิธีใดที่จะบังคับให้ทุบตีอย่างปลอดภัยเพื่อใช้คำสั่ง builtin หรืออย่างน้อยตรวจพบว่าคำสั่งไม่ใช่ builtin โดยไม่ต้องล้างสภาพแวดล้อมทั้งหมดหรือไม่
ฉันรู้ว่ามีใครบางคนควบคุมสภาพแวดล้อมของคุณคุณอาจเมาอยู่ดี แต่อย่างน้อยสำหรับนามแฝงที่คุณมีตัวเลือกที่จะไม่เรียกนามแฝงด้วยการแทรก a \
ก่อนหน้านี้
env
ไม่ได้นิยามใหม่เป็นฟังก์ชันด้วย มันน่ากลัวมาก ฉันคิดว่าตัวละครพิเศษจะช่วยได้ - การโทรด้วยเส้นทางแบบเต็มซึ่งรวมถึงการ/
ใช้.
กับแหล่งที่มาและอื่น ๆ แต่ยังสามารถใช้สำหรับชื่อฟังก์ชั่น! คุณสามารถกำหนดฟังก์ชันที่คุณต้องการได้ใหม่ แต่ก็ยากที่จะกลับไปเรียกคำสั่งเดิม
#/bin/sh
หากนี่ไม่ใช่เชลล์เชิงโต้ตอบเริ่มต้น
env
คำสั่งมาก่อนเช่นนี้:env -i <SCRIPT.sh>