Tôi đã gặp một lệnh Linux , builtin cd
.
Sự khác biệt giữa các lệnh builtin cd
và là cd
gì?
Trên thực tế, tôi đã thực hiện một số nghiên cứu về sự khác biệt, nhưng tôi không thể tìm thấy một lời giải thích đáng chú ý và quan trọng về điều này.
Tôi đã gặp một lệnh Linux , builtin cd
.
Sự khác biệt giữa các lệnh builtin cd
và là cd
gì?
Trên thực tế, tôi đã thực hiện một số nghiên cứu về sự khác biệt, nhưng tôi không thể tìm thấy một lời giải thích đáng chú ý và quan trọng về điều này.
Câu trả lời:
Các cd
lệnh là một built-in, vì vậy thường builtin cd
sẽ làm điều tương tự như cd
. Nhưng có một sự khác biệt nếu cd
được xác định lại là hàm hoặc bí danh, trong trường hợp đó cd
sẽ gọi hàm / bí danh nhưng builtin cd
vẫn sẽ thay đổi thư mục (nói cách khác, sẽ giữ cho có thể truy cập được tích hợp ngay cả khi bị chặn bởi hàm.)
Ví dụ:
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
Hoặc với một bí danh:
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
Sử dụng builtin
cũng là một cách tốt để xác định cd
hàm thực hiện một cái gì đó và thay đổi thư mục (vì việc gọi cd
từ nó sẽ tiếp tục gọi lại hàm đó trong một đệ quy vô tận.)
Ví dụ:
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
và \cd mysubdir
không?
cd
, trong trường hợp đó \cd
sẽ bỏ qua bí danh và chạy hàm. Xem stackoverflow.com/a/16506263/4518341
Trong hầu hết các trường hợp, không có sự khác biệt (nhưng xem bên dưới). Các cd
lệnh là một built-in lệnh trong tất cả vỏ. Nó cần được tích hợp sẵn 1 vì một lệnh bên ngoài không thể thay đổi môi trường của trình gọi và việc thay đổi thư mục làm việc sẽ tạo ra một sự thay đổi trong môi trường của nó.
Các bash
lệnh builtin
lực lượng vỏ để sử dụng được xây dựng trong phiên bản của một lệnh, mặc dù có thể có một chức năng vỏ, bí danh, hoặc lệnh bên ngoài sẵn có cùng tên.
Trong trường hợp có được ví dụ như một chức năng vỏ với tên cd
, sau đó builtin cd
sẽ không gọi đó. Việc sử dụng builtin cd
bỏ qua mọi chức năng bị quá tải có thể được thêm vào thông qua chức năng shell hoặc bí danh của người dùng.
Thí dụ:
Các cd
built-in lệnh có thể bị quá tải bởi một hàm cập nhật kịp thời:
cd() {
builtin cd "$@" && PS1=$(__update_prompt)
}
trong đó __update_prompt
một số hàm do người dùng cung cấp khác tạo ra một chuỗi.
Hàm builtin cd
trong sẽ không gọi hàm đệ quy. Sử dụng builtin cd
trong trình bao có chức năng này đang hoạt động, ngoài ra sẽ không gọi hàm.
1 Có các Unice với một cd
lệnh bên ngoài (macOS, và, tôi tin rằng, Solaris). Mục đích của lệnh đó, không thể thay đổi thư mục làm việc cho shell, có thể để đáp ứng tiêu chuẩn POSIX, liệt kê cd
là một trong những tiện ích bên ngoài nên có ( cd
không phải là một trong những "tiện ích dựng sẵn đặc biệt") . Nó cũng có thể phục vụ như một thử nghiệm để xem liệu thay đổi thư mục công việc sang một thư mục nhất định có khả thi hay không .
cd
lệnh bên ngoài .