Điểm của lệnh bên ngoài `cd` là gì?


71

Như được tham chiếu trong câu trả lời hay này , các hệ thống POSIX có một nhị phân bên ngoài ngoài cdphần dựng sẵn. Trên OS X 10.8 /usr/bin/cd. Bạn không thể sử dụng nó như nội dung cdvì nó thoát ngay lập tức sau khi thay đổi thư mục làm việc của chính nó. Mục đích của nó là gì?


Lưu ý rằng Ubuntu và CentOS (và do đó có lẽ là Red Hat) không có /usr/bin/cd, chỉ có vỏ được tích hợp sẵn.
Keith Thompson

1
Fedora 19 của tôi bao gồm /bin/cdtuy nhiên.
slm

1
Debian (Tôi đã kiểm tra một số bản phát hành, bao gồm cả bản thử nghiệm hiện tại) /bin/cdcũng không có /usr/bin/cd.
derobert

1
Tôi đoán điều đó làm cho các hệ thống này không nghiêm chỉnh POSIX. Giống như mọi người khác. :)
kojiro

Câu trả lời:


64

Nó phục vụ chủ yếu như đảm bảo rương công cụ POSIX có sẵn cả bên trong và bên ngoài vỏ (xem cơ sở lý luận POSIX để yêu cầu những cái đó ).

Đối với cd, điều đó không hữu ích lắm nhưng lưu ý rằng cdthay đổi thư mục nhưng có tác dụng phụ khác: nó trả về trạng thái thoát giúp xác định xem bạn có thể vào chdir()thư mục đó hay không và đưa ra thông báo lỗi hữu ích giải thích lý do bạn không thể chdir()khi bạn không thể

Thí dụ:

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

Một tác dụng phụ tiềm năng khác là tự động đếm thư mục.

Trên một vài hệ thống, hầu hết các lệnh bên ngoài cho các nội dung shell tiêu chuẩn được triển khai dưới dạng liên kết tượng trưng cho cùng một tập lệnh thực hiện:

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

Đó là bắt đầu một shell và chạy dựng sẵn trong nó.

Một số hệ thống khác (như GNU), có các tiện ích như các lệnh thực thi thực sự có thể dẫn đến nhầm lẫn khi hành vi khác với phiên bản dựng sẵn của shell.


2
+1 để quan sát về tác dụng phụ và thông báo lỗi. Không phải lúc nào cũng được giải thích rõ ràng với người dùng mới rằng rất nhiều thành ngữ thông minh trong Unix đến từ việc sử dụng cẩn thận các tác dụng phụ. Và bản thân các trang người đàn ông chưa bao giờ giỏi mô tả bức tranh lớn hơn.
RBerteig

Đến đây từ một câu hỏi tương tự trên SO, bạn có thể giải thích ý của bạn khi bạn nói "tự động hóa một thư mục" không?
ffledgling


1
Để giải nén suy nghĩ của Stéphane Chazelas một chút: nếu bạn cần đảm bảo rằng một thư mục tự động thực tế được gắn mà không thực hiện bất kỳ thay đổi nào trên đó và không cố gắng đọc bất kỳ tệp nào, bạn có thể sử dụng cdlệnh bên ngoài . Có thể hữu ích trong việc theo dõi sự sẵn có của một hệ thống tập tin từ xa tự động, hoặc có lẽ trước khi thực hiện một việc quan trọng về thời gian với một hệ thống.
telcoM

11

Thực tế một lệnh cd không được xây dựng trong có sẵn là chủ yếu do sự POSIX yêu cầu cho tất cả các lệnh nội trú thường xuyên để có thể được gọi bởi các lệnh gia đình exec env, find, nice, nohup, timexargskết hợp với thực tế một số các lệnh này không được tự thực hiện như builtins.

Điều đó không có ý nghĩa gì nhiều cdmặc dù việc kết hợp nó với các lệnh này là khá vô nghĩa. Dưới đây là các ví dụ có thể sử dụng nhiều hơn hoặc ít hơn:

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

2
Một số tích hợp thực sự được miễn quy tắc đó . Kỳ lạ thay, cd không phải là một trong số họ.
Kevin

5
@Kevin Tôi đã viết nó là một yêu cầu cho tất cả các lệnh nội trú thường xuyên , những người miễn là lệnh nội trú đặc biệt : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unsetsẽ là không thích hợp như các lệnh bên ngoài trong khi cdlà một dựng sẵn thường có một số trường hợp sử dụng tài liệu như một lệnh.
jlliagre

1

Ngoài việc kiểm tra xem một đường dẫn có tương ứng với một thư mục có thể truy cập hay không, cdtệp thực thi sẽ xử lý và sử dụng CDPATHbiến đó và sẽ in ra đường dẫn tuyệt đối của thư mục đã giải quyết nếu nó được sử dụng thành công.

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

Điều này chỉ đôi khi rất hữu ích, nhưng sẽ lưu lại việc thực hiện cùng logic để tìm kiếm các thư mục phù hợp. Một trường hợp sử dụng cụ thể là tìm thư mục hiện có đầu tiên của một tên cụ thể theo một số cha mẹ có thể.

cdcũng xử lý OLDPWDcho cd -, nhưng đó là chưa cụ thể hữu ích vì các biến môi trường sẽ đã có sẵn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.