ความแตกต่างระหว่างคำสั่ง builtin cd และ cd คืออะไร?


17

builtin cdผมพบคำสั่งลินุกซ์

ความแตกต่างระหว่างคำสั่งbuiltin cdและcdคืออะไร?

ที่จริงแล้วฉันได้ทำการวิจัยเกี่ยวกับความแตกต่าง แต่ฉันไม่สามารถหาคำอธิบายที่น่าทึ่งและมีนัยสำคัญเกี่ยวกับเรื่องนี้


1
ดูเพิ่มเติมที่unix.stackexchange.com/q/38808/117549
Jeff Schaller

ดูเพิ่มเติมได้ที่: stackoverflow.com/q/15691977/974555
gerrit

คำตอบ:


41

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

5
+1 ตัวอย่างเป็นตัวอย่างที่นี่โดยเฉพาะ
Tashus

2
ในกรณีของนามแฝงมีความแตกต่างระหว่างbuiltin cd mysubdirและ\cd mysubdir?
gerrit

2
@gerrit เฉพาะในกรณีที่มีชื่อฟังก์ชั่นcdซึ่งในกรณีนี้\cdจะข้ามนามแฝงและเรียกใช้ฟังก์ชั่น ดูstackoverflow.com/a/16506263/4518341
wjandrea

15

ในกรณีส่วนใหญ่ไม่มีความแตกต่าง (แต่ดูด้านล่าง) 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ไม่ใช่หนึ่งใน "ยูทิลิตี้บิวด์อินพิเศษ") . นอกจากนี้ยังอาจทำหน้าที่เป็นผู้ทดสอบเพื่อดูว่ามีการเปลี่ยนแปลงการทำงานเพื่อไดเรกทอรีไดเรกทอรีที่กำหนดจะเป็นไปได้


FWIW, MacOS จะตกอยู่ในหมวดหมู่ของ OS ด้วยcdคำสั่งภายนอก
yoann

@yoann แน่นอนมันทำ
Kusalananda

ขอบคุณ - คุณทำให้วันของฉันดีขึ้นแล้วมีการวิจัยดีมาก
james

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