Làm thế nào là các lệnh hệ thống như ls được tạo ra?


19

Tôi có một số nghi ngờ về * nix.

  • Tôi không biết loại tệp thực thi nào ls, cho dù đó là .sh hoặc .ksh hoặc bất kỳ loại hệ thống thực thi nào khác nếu có, đó là gì?

  • Khi tôi cố gắng xem mã nguồn của lslệnh trông như thế nào, nó hiển thị một cái gì đó không thể đọc được, phương thức nào * nix sử dụng để tạo các loại tệp không thể đọc này và tôi có thể làm cho các tệp của mình giống với các tệp này (như ls- không thể đọc được).



4
Tôi nghĩ rằng nó liên quan nhiều hơn đến URL ở trên hơn là bản sao.
slm

Câu trả lời:


31

Bạn có thể xác định bản chất của một tệp thực thi trong Unix bằng cách sử dụng filelệnh và typelệnh.

kiểu

Bạn sử dụng typeđể xác định vị trí thực thi trên đĩa như sau:

$ type -a ls
ls is /usr/bin/ls
ls is /bin/ls

Vì vậy, bây giờ tôi biết rằng lsnó nằm ở đây trên hệ thống của tôi ở 2 địa điểm: /usr/bin/ls& /bin/ls. Nhìn vào những thực thi đó tôi có thể thấy chúng giống hệt nhau:

$ ls -l /usr/bin/ls /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /bin/ls
-rwxr-xr-x. 1 root root 120232 Jan 20 05:11 /usr/bin/ls

LƯU Ý: Bạn có thể xác nhận chúng giống hệt nhau ngoài kích thước của chúng bằng cách sử dụng cmphoặc diff.

với khác
$ diff -s /usr/bin/ls /bin/ls
Files /usr/bin/ls and /bin/ls are identical
với cmp
$ cmp /usr/bin/ls /bin/ls
$ 

Sử dụng tập tin

Nếu tôi truy vấn chúng bằng filelệnh:

$ file /usr/bin/ls /bin/ls
/usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped
/bin/ls:     ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x303f40e1c9349c4ec83e1f99c511640d48e3670f, stripped

Vì vậy, đây sẽ là các chương trình vật lý thực tế đã được biên dịch từ C / C ++. Nếu chúng là các kịch bản shell, chúng thường trình bày như thế này để file:

$ file somescript.bash 
somescript.bash: POSIX shell script, ASCII text executable

ELF là gì?

ELF là một định dạng tệp , nó là đầu ra của một trình biên dịch gcc, như được sử dụng để biên dịch các chương trình C / C ++ như ls.

Trong điện toán, Định dạng có thể thực thi và có thể liên kết (ELF, trước đây được gọi là Định dạng liên kết mở rộng) là định dạng tệp tiêu chuẩn phổ biến cho các tệp thực thi, mã đối tượng, thư viện dùng chung và kết xuất lõi.

Nó thường sẽ có một trong các phần mở rộng sau trong tên tệp: none, .o, .so, .elf, .prx, .puff, .bin


@lgeorget - Xem phần Hỏi & Đáp này để biết các mẹo sử dụng loại so với: unix.stackexchange.com/questions/85249/ . Nói chung, tốt nhất là chỉ sử dụng typebất cứ nơi nào bạn muốn sử dụng whichhoặc whereis.
slm

3
Ngoài ra, đối với các công cụ GNU, mã nguồn là tự do có sẵn, hãy bắt đầu tìm kiếm của bạn tại gnu.org/software
glenn jackman

Đối với thử nghiệm giống hệt nhau, bạn thực sự nên sử dụng một cái gì đó như md5sumhoặc sha1sum, không chỉ kiểm tra kích thước và thời gian tập tin.
Bob

@Bob - Những tệp đó giống hệt nhau không liên quan gì đến Q nên tôi đã chỉ ra một phương pháp đơn giản. Để so sánh các tệp tôi đã sử dụng một công cụ apt hơn như cmp có nghĩa là để so sánh các tệp nhị phân. Cũng đang tìm xem gói nào họ cung cấp sẽ cho biết họ có liên quan hay không. Cả hai đều là một phần coreutils-8.21-13.fc19.x86_64và tôi chỉ biết họ giống hệt nhau sau 20 năm đối phó với các bản phát hành Red Hat.
slm

@Bob - xem cập nhật để biết ví dụ về so sánh các tệp.
slm

9

Nó là một tệp thực thi nhị phân (được biên dịch thành mã máy, giống như hầu hết các hệ thống). Các kịch bản Shell giống như "keo" để nối các phần lại với nhau để nhanh chóng và linh hoạt tạo ra các giải pháp từ những thứ hiện có. Đó là sức mạnh của * nix.

Bạn cần mã nguồn (c, đôi khi c ++, là ngôn ngữ phổ biến nhất trên * nix), không chỉ là tệp thực thi được biên dịch. Vì nó là nguồn mở, bạn có thể lấy mã cho mọi thứ từ kho lưu trữ trực tuyến (các tiện ích cốt lõi thường là từ dự án gnu). Tuy nhiên, sẽ hơi khó khăn nếu bạn không biết cách sử dụng git hoặc các hệ thống theo dõi phiên bản khác.

Đây là tệp ls.c, nếu nó giúp: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c


Ồ và để làm rõ câu hỏi làm thế nào để tạo các ứng dụng nhị phân: chọn trong số vô số ngôn ngữ lập trình (ngoại trừ một cặp được giải thích hoặc bán phiên dịch, chẳng hạn như python, java, javascript, ... mà theo truyền thống không tạo ra một tệp thực thi độc lập tập tin nhị phân). Sau đó học cách sử dụng ngôn ngữ đó và cách biên dịch nó.
orion
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.