ประเด็นของคำสั่งภายนอก `cd` คืออะไร?


71

ตามที่อ้างถึงในคำตอบที่ดีนี้ระบบ POSIX มีไบนารี่ภายนอกcdเพิ่มเติมจากเชลล์บิวด์อิน บน OS X 10.8 /usr/bin/cdมัน คุณไม่สามารถใช้มันเหมือน builtin ได้cdเพราะมันจะออกมาทันทีหลังจากเปลี่ยนไดเรกทอรีการทำงานของมันเอง มันมีจุดประสงค์อะไร


โปรดทราบว่า Ubuntu และ CentOS (และ Red Hat น่าจะเป็นไปได้) ไม่มี/usr/bin/cdในตัวเชลล์เท่านั้น
Keith Thompson

1
/bin/cdอย่างไรก็ตามFedora ของฉันยังรวมถึง
slm

1
Debian (ฉันจะตรวจสอบรุ่นหลายแห่งรวมถึงการทดสอบในปัจจุบัน) มีค่ามิได้/bin/cd /usr/bin/cd
Derobert

1
ฉันเดาว่าระบบเหล่านี้จะไม่ทำ POSIX อย่างเคร่งครัด เหมือนทุกคน :)
kojiro

คำตอบ:


64

มันทำหน้าที่เป็นหลักในการตรวจสอบให้แน่ใจว่าหีบเครื่องมือ POSIX มีให้บริการทั้งด้านในและด้านนอกของเปลือก (ดูเหตุผลของ POSIX สำหรับการใช้งาน )

สำหรับcdนั่นไม่เป็นประโยชน์อย่างมาก แต่โปรดทราบว่าcdการเปลี่ยนแปลงไดเรกทอรี แต่มีผลข้างเคียงอื่น ๆ : มันคืนสถานะการออกที่ช่วยในการตรวจสอบว่าคุณสามารถchdir()ไปที่ไดเรกทอรีนั้นหรือไม่และแสดงข้อความแสดงข้อผิดพลาดที่มีประโยชน์อธิบายว่าทำไมคุณไม่chdir()เมื่อคุณไม่สามารถ

ตัวอย่าง:

dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)

ผลข้างเคียงที่อาจเกิดขึ้นได้อีกอย่างหนึ่งคือการติดตั้งไดเรกทอรีโดยอัตโนมัติ

ในบางระบบคำสั่งภายนอกส่วนใหญ่สำหรับเชลล์บิลด์มาตรฐานจะถูกนำไปใช้เป็น symlink กับสคริปต์เดียวกันกับที่ทำ:

#! /bin/sh -
"${0##*/}" "$@"

นั่นคือการเริ่มต้นเปลือกและเรียกใช้ builtin ในนั้น

ระบบอื่นบางระบบ (เช่น GNU) มียูทิลิตีเหมือนกับคำสั่งที่สามารถเรียกใช้งานได้จริงซึ่งอาจทำให้เกิดความสับสนเมื่อลักษณะการทำงานแตกต่างจากเวอร์ชันของเชลล์ในตัว


2
+1 สำหรับการสังเกตเกี่ยวกับผลข้างเคียงและข้อความแสดงข้อผิดพลาด ผู้ใช้รายใหม่ไม่ได้อธิบายเสมอไปว่าสำนวนที่ฉลาดใน Unix นั้นมาจากการใช้ผลข้างเคียงอย่างระมัดระวัง และหน้าคนเองไม่เคยดีที่อธิบายภาพใหญ่
RBerteig

มาที่นี่จากคำถามที่คล้ายกันใน SO คุณช่วยอธิบายสิ่งที่คุณหมายถึงเมื่อคุณพูดว่า "ไดเรกทอรีอัตโนมัติ" หรือไม่?
ffledgling


1
ในการคลายความคิดของStéphane Chazelas เล็กน้อย: ถ้าคุณต้องการให้แน่ใจว่าไดเรกทอรีที่ถอดออกได้โดยอัตโนมัตินั้นถูกเมาท์โดยไม่ทำการเปลี่ยนแปลงใด ๆ และไม่พยายามอ่านไฟล์ใด ๆ คุณสามารถใช้cdคำสั่งภายนอกได้ อาจมีประโยชน์ในการตรวจสอบความพร้อมใช้งานของระบบไฟล์รีโมตที่เมาต์ได้อัตโนมัติหรืออาจทำบางสิ่งบางอย่างที่สำคัญกับระบบ
telcoM

11

ความจริงคำสั่ง cd ไม่ใช่ builtin สามารถใช้ได้เป็นหลักเนื่องจากการ POSIX ต้องการสำหรับ builtins ปกติจะเป็น callable โดยคำสั่งครอบครัว exec env, find, nice, nohup, timeและxargsรวมถึงความจริงที่บางส่วนของคำสั่งเหล่านี้จะไม่ถูกนำมาใช้เป็นตัวเอง builtins

ที่ไม่เหมาะสมมากสำหรับcdการรวมเป็นคำสั่งเหล่านี้ค่อนข้างไม่มีจุดหมาย ต่อไปนี้เป็นตัวอย่างที่สามารถเชื่อถือได้มากขึ้นหรือน้อยลง:

find . -type d -exec cd {} \;
env HOME=/foo cd

2
จำนวนบิวด์อินได้รับการยกเว้นจากกฎนั้นจริง ๆ น่าแปลกที่ cd ไม่ใช่หนึ่งในนั้น
Kevin

5
@ เควินฉันเขียนว่ามันเป็นข้อกำหนดสำหรับบิลด์ปกติทุกตัวบิลด์ที่ได้รับการยกเว้นคือบิลด์พิเศษ : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unsetจะไม่เกี่ยวข้องกับคำสั่งภายนอกในขณะที่cdบิลด์ปกติจะมีกรณีใช้เอกสารเป็นคำสั่ง
jlliagre

1

นอกเหนือจากการตรวจสอบว่าพา ธ สอดคล้องกับไดเร็กทอรีที่สามารถเข้าถึงได้แล้วcdโปรแกรมจะประมวลผลและใช้CDPATHตัวแปรหรือไม่และจะพิมพ์พา ธ สัมบูรณ์ของไดเร็กทอรีที่แก้ไขแล้วหากใช้สำเร็จ

$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib

นี่เป็นเพียงบางครั้งมีประโยชน์มาก แต่จะบันทึกการปรับใช้ตรรกะเดียวกันสำหรับการค้นหาไดเรกทอรีที่ตรงกัน กรณีใช้งานที่เป็นรูปธรรมคือการค้นหาไดเรกทอรีที่มีอยู่เป็นครั้งแรกของชื่อเฉพาะภายใต้ผู้ปกครองที่เป็นไปได้

cdนอกจากนี้ยังมีการประมวลผลOLDPWDสำหรับcd -แต่ที่เป็นประโยชน์น้อยเป็นรูปธรรมตั้งแต่ตัวแปรสภาพแวดล้อมที่มีอยู่แล้วจะใช้ได้

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