คำสั่งที่สร้างไว้ในเชลล์มักจะถูกสร้างขึ้นเนื่องจากการเพิ่มประสิทธิภาพที่สิ่งนี้ให้ เรียกภายนอก ตัวอย่างเช่นจะช้ากว่าที่ใช้ในการสร้างprintf
printf
เนื่องจากยูทิลิตี้บางอย่างไม่จำเป็นต้องมีการสร้างขึ้นภายในนอกจากจะมีความพิเศษเช่นcd
พวกเขายังมีให้เป็นสาธารณูปโภคภายนอก นี่คือสคริปต์ที่จะไม่ทำลายหากพวกเขาถูกตีความโดยเชลล์ที่ไม่ได้ให้ตัวในการเทียบเท่า
บิวด์อินบางเชลล์ยังจัดเตรียมส่วนขยายให้กับคำสั่งเทียบเท่าภายนอก printf
ตัวอย่างเช่นBash's สามารถทำได้
$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world
(พิมพ์ไปที่ตัวแปร) ซึ่งภายนอก/usr/bin/printf
ไม่สามารถทำได้เนื่องจากไม่สามารถเข้าถึงตัวแปรเชลล์ในเซสชันเชลล์ปัจจุบัน (และไม่สามารถเปลี่ยนแปลงได้)
สร้างขึ้นในระบบสาธารณูปโภคยังไม่ได้มีข้อ จำกัด ที่บรรทัดคำสั่งของพวกเขาขยายตัวจะต้องมีสั้นกว่าความยาวบาง การทำ
printf '%s\n' *
จึงปลอดภัยหากprintf
เป็นคำสั่งในตัวเชลล์ ข้อ จำกัด เกี่ยวกับความยาวของบรรทัดคำสั่งมาจากexecve()
ฟังก์ชันไลบรารี C ที่ใช้เพื่อดำเนินการคำสั่งภายนอก หากบรรทัดคำสั่งและสภาพแวดล้อมปัจจุบันมีขนาดใหญ่กว่าARG_MAX
ไบต์ (ดูgetconf ARG_MAX
ในเชลล์) การเรียกใช้execve()
จะล้มเหลว หากยูทิลิตี้ถูกสร้างขึ้นในเชลล์คุณexecve()
ไม่จำเป็นต้องเรียกใช้
$PATH
สร้างขึ้นในสาธารณูปโภคจะมีความสำคัญมากกว่าที่พบในสาธารณูปโภค หากต้องการปิดใช้งานคำสั่งในตัวbash
ให้ใช้เช่น
enable -n printf
มีรายการย่อของยูทิลิตี้ที่จำเป็นต้องสร้างไว้ในเชลล์ (นำมาจากรายการบิวด์อินพิเศษของ POSIX มาตรฐาน)
break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset
สิ่งเหล่านี้จำเป็นต้องถูกสร้างขึ้นภายในเนื่องจากพวกเขาจัดการสภาพแวดล้อมและการไหลของโปรแกรมของเชลล์เซสชันปัจจุบันโดยตรง ยูทิลิตีภายนอกจะไม่สามารถทำได้
ที่น่าสนใจcd
ไม่ได้เป็นส่วนหนึ่งของรายการนี้ แต่ POSIX พูดเกี่ยวกับสิ่งต่อไปนี้ :
เนื่องจากcd
ส่งผลกระทบต่อสภาพแวดล้อมการเรียกใช้เชลล์ในปัจจุบันจึงมีการจัดเตรียมไว้เป็นเชลล์ปกติในตัว ถ้ามันถูกเรียกใน subshell หรือสภาพแวดล้อมการดำเนินการยูทิลิตี้ที่แยกต่างหากเช่นหนึ่งในสิ่งต่อไปนี้:
(cd /tmp)
nohup cd
find . -exec cd {} \;
ไม่ส่งผลกระทบต่อไดเร็กทอรีการทำงานของสภาพแวดล้อมของผู้โทร
ฉันจึงสมมติว่าตัว "พิเศษ" ไม่สามารถมีคู่หูภายนอกได้ในขณะที่cd
ในทางทฤษฎีอาจมี (แต่ก็ไม่ได้ทำอะไรมาก)