builtin cd
ผมพบคำสั่งลินุกซ์
ความแตกต่างระหว่างคำสั่งbuiltin cd
และcd
คืออะไร?
ที่จริงแล้วฉันได้ทำการวิจัยเกี่ยวกับความแตกต่าง แต่ฉันไม่สามารถหาคำอธิบายที่น่าทึ่งและมีนัยสำคัญเกี่ยวกับเรื่องนี้
builtin cd
ผมพบคำสั่งลินุกซ์
ความแตกต่างระหว่างคำสั่งbuiltin cd
และcd
คืออะไร?
ที่จริงแล้วฉันได้ทำการวิจัยเกี่ยวกับความแตกต่าง แต่ฉันไม่สามารถหาคำอธิบายที่น่าทึ่งและมีนัยสำคัญเกี่ยวกับเรื่องนี้
คำตอบ:
cd
คำสั่งในตัวเพื่อให้ได้ตามปกติจะทำสิ่งเดียวกับbuiltin cd
cd
แต่มีความแตกต่างถ้าcd
นิยามใหม่เป็นฟังก์ชั่นหรือนามแฝงซึ่งในกรณีนี้cd
จะเรียกฟังก์ชัน / นามแฝง แต่builtin cd
จะยังคงเปลี่ยนไดเรกทอรี (ในคำอื่น ๆ จะทำให้การเข้าถึงในตัวแม้ว่าการอุดตันโดยฟังก์ชั่น)
ตัวอย่างเช่น:
user:~$ cd () { echo "I won't let you change directories"; }
user:~$ cd mysubdir
I won't let you change directories
user:~$ builtin cd mysubdir
user:~/mysubdir$ unset -f cd # undefine function
หรือด้วยนามแฝง:
user:~$ alias cd='echo Trying to cd to'
user:~$ cd mysubdir
Trying to cd to mysubdir
user:~$ builtin cd mysubdir
user:~/mysubdir$ unalias cd # undefine alias
ใช้builtin
ยังเป็นวิธีที่ดีที่จะกำหนดcd
ฟังก์ชั่นที่ไม่บางสิ่งบางอย่างและเปลี่ยนแปลง directory (ตั้งแต่โทรcd
จากมันก็จะให้โทรฟังก์ชั่นอีกครั้งในการเรียกซ้ำไม่มีที่สิ้นสุด.)
ตัวอย่างเช่น:
user:~ $ cd () { echo "Changing directory to ${1-home}"; builtin cd "$@"; }
user:~ $ cd mysubdir
Changing directory to mysubdir
user:~/mysubdir $ cd
Changing directory to home
user:~ $ unset -f cd # undefine function
builtin cd mysubdir
และ\cd mysubdir
?
cd
ซึ่งในกรณีนี้\cd
จะข้ามนามแฝงและเรียกใช้ฟังก์ชั่น ดูstackoverflow.com/a/16506263/4518341
ในกรณีส่วนใหญ่ไม่มีความแตกต่าง (แต่ดูด้านล่าง) cd
คำสั่งในตัวคำสั่งในเปลือกหอยทั้งหมด มันจะต้องมี built-in 1เป็นคำสั่งภายนอกไม่สามารถเปลี่ยนสภาพแวดล้อมของเชลล์ที่เรียกใช้และการเปลี่ยนไดเรกทอรีทำงานถือเป็นการเปลี่ยนแปลงในสภาพแวดล้อมของมัน
bash
คำสั่งbuiltin
กองกำลังเปลือกที่จะใช้ในตัวรุ่นของคำสั่งถึงแม้ว่าอาจจะมีฟังก์ชั่นเปลือกนามแฝงหรือมีคำสั่งภายนอกที่มีชื่อเดียวกัน
ในกรณีที่มีเป็นเช่นฟังก์ชั่นเปลือกที่มีชื่อcd
แล้วbuiltin cd
จะไม่ได้เรียกว่า การใช้builtin cd
ข้ามฟังก์ชันการทำงานที่โอเวอร์โหลดใด ๆ ที่อาจถูกเพิ่มผ่านฟังก์ชันเชลล์หรือนามแฝงโดยผู้ใช้
ตัวอย่าง:
cd
ในตัวคำสั่งอาจจะมากเกินไปจากฟังก์ชั่นที่ปรับปรุงพรอมต์:
cd() {
builtin cd "$@" && PS1=$(__update_prompt)
}
โดยที่__update_prompt
ฟังก์ชั่นอื่น ๆ ที่ผู้ใช้เป็นผู้จัดหานั้นจะส่งเอาต์พุตสตริง
builtin cd
ในการทำงานจะไม่เรียกฟังก์ชั่นซ้ำ การใช้builtin cd
เชลล์ที่ฟังก์ชันนี้ทำงานอยู่จะไม่เรียกใช้ฟังก์ชันเพิ่มเติม
1มี Unices พร้อมcd
คำสั่งภายนอก(macOS และฉันเชื่อว่า Solaris) วัตถุประสงค์ของคำสั่งนั้นซึ่งไม่สามารถเปลี่ยนไดเรกทอรีการทำงานสำหรับเชลล์ได้อาจเป็นไปตามมาตรฐาน POSIX ซึ่งแสดงรายการcd
เป็นหนึ่งในยูทิลิตี้ภายนอกที่ควรจะมี (cd
ไม่ใช่หนึ่งใน "ยูทิลิตี้บิวด์อินพิเศษ") . นอกจากนี้ยังอาจทำหน้าที่เป็นผู้ทดสอบเพื่อดูว่ามีการเปลี่ยนแปลงการทำงานเพื่อไดเรกทอรีไดเรกทอรีที่กำหนดจะเป็นไปได้
cd
คำสั่งภายนอก