Bagaimana perintah sistem seperti ls dibuat?

19

Saya ragu tentang * nix.

  • Saya tidak tahu jenis file yang dapat dieksekusi ls, apakah itu .sh atau .ksh atau jenis sistem yang dapat dieksekusi jika ya, apa itu?

  • ketika saya mencoba untuk melihat seperti apa kode sumber dari lsperintah, itu menunjukkan sesuatu yang tidak dapat dibaca, metode apa yang digunakan * nix untuk membuat jenis file yang tidak dapat dibaca dan dapatkah saya membuat file saya mirip dengan file-file ini (seperti ls- tidak dapat dibaca).

Jeyanthinath
sumber
2
duplikat yang mungkin dari Apa perbedaan antara perintah builtin dan yang tidak?
David Wilkins
4
Saya pikir ini lebih terkait dengan URL di atas daripada dup.
slm

Jawaban:

31

Anda dapat menentukan sifat suatu executable di Unix menggunakan fileperintah dan typeperintah.

Tipe

Anda menggunakan typeuntuk menentukan lokasi yang dapat dieksekusi pada disk seperti:

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

Jadi sekarang saya tahu bahwa lsini terletak di sistem saya di 2 lokasi: /usr/bin/ls& /bin/ls. Melihat itu executable saya bisa melihat mereka identik:

$ 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

CATATAN: Anda dapat mengonfirmasi bahwa mereka identik di luar ukurannya dengan menggunakan cmpatau diff.

dengan diff
$ diff -s /usr/bin/ls /bin/ls
Files /usr/bin/ls and /bin/ls are identical
dengan cmp
$ cmp /usr/bin/ls /bin/ls
$ 

Menggunakan file

Jika saya meminta mereka menggunakan fileperintah:

$ 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

Jadi ini akan menjadi program fisik aktual yang telah dikompilasi dari C / C ++. Jika mereka adalah skrip shell, mereka biasanya menyajikan seperti ini untuk file:

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

Apa itu ELF?

ELF adalah format file , ini adalah output dari kompiler seperti gcc, yang digunakan untuk mengkompilasi program C / C ++ seperti ls.

Dalam komputasi, Format Eksekusi dan Linkable (ELF, sebelumnya disebut Extensible Linking Format) adalah format file standar umum untuk executable, kode objek, perpustakaan bersama, dan dump inti.

Biasanya akan memiliki salah satu ekstensi berikut dalam nama file: none, .o, .so, .elf, .prx, .puff, .bin

slm
sumber
@ lgeorget - Lihat T&J ini untuk kiat menggunakan tipe vs. yang: unix.stackexchange.com/questions/85249/… . Ini umumnya terbaik untuk hanya digunakan typedi mana saja Anda tergoda untuk menggunakan whichatau whereis.
slm
3
Selain itu, untuk alat GNU, kode sumber tersedia secara bebas, mulai pencarian Anda di gnu.org/software
glenn jackman
Untuk pengujian yang identik, Anda harus menggunakan sesuatu seperti md5sumatau sha1sum, tidak hanya memeriksa ukuran dan waktu file.
Bob
@ Bob - File-file yang identik tidak ada hubungannya dengan Q jadi saya menunjukkan metode sederhana. Untuk membandingkan file saya akan menggunakan alat yang lebih tepat seperti cmp yang dimaksudkan untuk membandingkan file biner. Juga mencari untuk melihat paket apa yang disediakan oleh mereka akan menunjukkan apakah mereka terkait atau tidak. Mereka berdua bagian dari coreutils-8.21-13.fc19.x86_64dan saya hanya tahu mereka identik dari 20 tahun berurusan dengan rilis Red Hat.
slm
@ Bob - lihat pembaruan untuk contoh tentang membandingkan file.
slm
9

Ini adalah biner yang dapat dieksekusi (dikompilasi ke dalam kode mesin, seperti kebanyakan sistem). Script shell lebih seperti "lem" untuk menggabungkan bagian-bagian dengan cepat dan fleksibel menciptakan solusi dari barang-barang yang ada. Itulah kekuatan * nix.

Anda memerlukan kode sumber (c, kadang-kadang c ++, adalah bahasa yang paling umum di * nix), bukan hanya executable yang dikompilasi. Karena ini adalah open source, Anda bisa mendapatkan kode untuk semuanya dari repositori online (utilitas inti biasanya dari proyek gnu). Namun, ini agak sulit jika Anda tidak tahu cara menggunakan git atau sistem pelacakan versi lainnya.

Ini adalah file ls.c, jika itu membantu: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c

orion
sumber
Oh dan untuk memperjelas pertanyaan cara membuat aplikasi biner: pilih di antara bahasa pemrograman yang tak terhitung jumlahnya (kecuali untuk pasangan yang ditafsirkan atau semi-ditafsirkan, seperti python, java, javascript, ... yang secara tradisional tidak menghasilkan executable mandiri yang berdiri sendiri file biner). Kemudian belajar menggunakan bahasa itu dan cara mengompilasinya.
orion