Các hàm shell được lưu trữ trên Linux ở đâu?


11

Lúc đầu, tôi đang tìm kiếm lý do whichkhông tạo ra bất cứ điều gì sau khi đưa ra một số chương trình nhất định làm đối số, ví dụ cd.

Từ những gì tôi tìm thấy ở đây , lý do có lẽ là cdtrên máy của tôi là một chức năng, được xác nhận bằng cách chạy type cd.

TLDR: Nhưng như các chương trình bình thường whichcó thể định vị nhờ $PATHbiến được đặt trong một trong những $PATHthư mục đó, các hàm hoặc tập lệnh như cdđược lưu trữ ở đâu?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}

Tôi nhận được cd is a shell builtin. Hãy xem trang người đàn ông cho vỏ của bạn (zsh?)
Xen2050

1
Kiểm tra unix.stackexchange.com/questions/85249/ Từ Vấn đề là đó là một lệnh kế thừa không nên được sử dụng - đặc biệt là vì những điều như câu hỏi này.
Joe

Câu trả lời:


12

Hàm do người dùng xác định

Thông thường các hàm bash được lưu trữ vĩnh viễn trong bashtập lệnh khởi động.

  • Các kịch bản khởi động trên toàn hệ thống: /etc/profilecho các shell đăng nhập và /etc/bashrccho các shell tương tác.
  • Người dùng xác định các tập lệnh khởi động: ~/.bash_profilecho các shell đăng nhập và ~/.bashrccho các shell tương tác.
  • Thông tin thêm về shell tương tác / đăng nhập có thể được tìm thấy trong mantrang bash trong phần HÓA ĐƠN.

Các hàm shell do người dùng xác định được tải động trong hàm băm (hoặc bảng tra cứu) khi bash bắt đầu. Từ tệp nguồn bash variable.c, định nghĩa cho bảng là:

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

Các hàm do người dùng xác định có thể được liệt kê bằng declarelệnh bash , các shell khác vẫn sử dụng typeset. Trong bash declaređã áp đặt typesetlệnh.

declare -f

Các hàm tồn tại trong bộ nhớ suốt đời của bash shell.

Các hàm được định nghĩa (dựng sẵn) của Shell

Đây là những chức năng thông thường như echo, printf, cd:. Chúng được biên dịch vào một thư viện được liên kết thành bashtệp thực thi. Xây dựng các định nghĩa vào thực thi giúp tiết kiệm thời gian so với tải một định nghĩa bên ngoài. Các định nghĩa cho các hàm này (được giữ trong .defcác tệp nguồn được phân tích cú pháp thành nguồn C) được giữ trong builtinsthư mục của nguồn bash.

Một bên hữu ích: để biết thông tin về việc sử dụng lệnh dựng sẵn shell help <command>. ví dụ

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare

Cảm ơn bạn cho câu trả lời trích đoạn đó. Đây chính xác là những gì tôi đang tìm kiếm. Bạn có nghĩ rằng có một công cụ để theo dõi quá trình tạo hàm bash hoặc một cái gì đó tương tự typesetsẽ hiển thị tập tin / tập lệnh nào gây ra việc tạo / thay đổi hàm không?
Gabrijel imunović

Tôi không biết về bất kỳ công cụ nào như vậy - nó sẽ là một tùy chọn hữu ích cho lệnh declarehoặc typesetđể hiển thị tệp nguồn của định nghĩa hàm. Tôi nghĩ đó là một vấn đề kỹ thuật phần mềm. Gần đây đã tìm thấy một hàm shell được định nghĩa trong một .aliastệp - không phải là điều tôi đang mong đợi!
suspectus

8

Các hàm Shell được lưu trữ trong bộ nhớ của shell (hoặc, có lẽ, trong các tệp tạm thời không có giấy tờ). Họ không tồn tại trong bất cứ cách nào có thể sử dụng cho đến khi bắt đầu vỏ (ví dụ, khi bạn đăng nhập vào một CLI, hoặc bắt đầu một cửa sổ shell như xterm) và chúng được định nghĩa (ví dụ, bằng cách đọc .bashrc, .bash_profilehoặc một cái gì đó tương tự) và họ ngừng tồn tại khi vỏ chấm dứt.


1
Bản chất phù du của một cái gì đó bạn gõ tại dấu nhắc là rất quan trọng. Phiếu bầu của tôi đi đến câu trả lời này Nếu bạn gõ cd () { pwd; builtin cd "$@"; }tại dấu nhắc thì vị trí duy nhất được lưu trữ là trong bộ nhớ của trình bao hiện đang chạy của bạn. (Ví dụ của tôi là Bash nhưng nguyên tắc tương tự áp dụng cho bất kỳ hệ vỏ nào.)
tripleee 30/12/14

6

cdvà các lệnh phổ biến khác như echo, typealiasđược gọi là nội dung .

Các lệnh dựng sẵn được chứa trong chính shell và các shell khác nhau có thể có các lệnh dựng sẵn khác nhau.


4
Tôi không biết có đáng để nhấn mạnh rằng mã thực thi cho các lệnh dựng sẵn như cdđược chứa trong chính chương trình shell hay không, ví dụ trong tệp /bin/bashnếu đó là shell của bạn. (Tôi nghĩ rằng từ ngữ của bạn ở đây là rõ ràng, nhưng tôi đã thấy mọi người bị lẫn lộn bởi tất cả các loại.)
David Z

1

Câu hỏi Siêu người dùng Tìm định nghĩa của hàm bash có liên quan chặt chẽ với câu hỏi này. Người dùng HairOfTheDog đã cung cấp câu trả lời này (diễn giải):

Các lệnh sau sẽ báo cáo vị trí (tên tệp và số dòng) của định nghĩa của hàm. Giả sử một hàm có tên foo,

# Turn on extended shell debugging
shopt -s extdebug

# Display the function’s name, line number and fully qualified source file
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

Ví dụ, đầu ra của các lệnh này có thể là:

foo 32 /source/private/main/developer/cue.pub.sh

Ở trên có thể chỉ hoạt động trong bashvà không phải trong vỏ POSIX nói chung.

Cảm ơn Blue Raspberry đã tìm thấy điều này!

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.