ls 之类的系统命令是如何创建的?

Jey*_*ath 19 shell executable architecture

我对 *nix 有一些疑问。

  • 我不知道是哪种类型的可执行文件ls,无论是 .sh 还是 .ksh 或任何其他类型的系统可执行文件(如果是),那是什么?

  • 当我试图查看ls命令的源代码是什么样子时,它显示了一些不可读的东西,*nix 使用什么方法来创建这些类型的不可读文件,我可以使我的文件类似于这些文件(例如ls- 不可读)。

slm*_*slm 31

您可以使用filecommand 和typecommand确定 Unix 中可执行文件的性质。

类型

type用来确定可执行文件在磁盘上的位置,如下所示:

$ type -a ls
ls is /usr/bin/ls
ls is /bin/ls
Run Code Online (Sandbox Code Playgroud)

所以我现在知道它ls位于我系统上的 2 个位置:/usr/bin/ls& /bin/ls。查看这些可执行文件,我可以看到它们是相同的:

$ 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
Run Code Online (Sandbox Code Playgroud)

注意:您可以使用cmp或来确认它们在尺寸之外是否相同diff

有差异
$ diff -s /usr/bin/ls /bin/ls
Files /usr/bin/ls and /bin/ls are identical
Run Code Online (Sandbox Code Playgroud) 与 cmp
$ cmp /usr/bin/ls /bin/ls
$ 
Run Code Online (Sandbox Code Playgroud)

使用文件

如果我使用以下file命令查询它们:

$ 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
Run Code Online (Sandbox Code Playgroud)

因此,这些将是从 C/C++ 编译的实际物理程序。如果它们是 shell 脚本,它们通常会像这样呈现给file

$ file somescript.bash 
somescript.bash: POSIX shell script, ASCII text executable
Run Code Online (Sandbox Code Playgroud)

什么是ELF?

ELF 是一种文件格式,它是gcc诸如ls.

在计算中,可执行和可链接格式(ELF,以前称为可扩展链接格式)是可执行文件、目标代码、共享库和核心转储的通用标准文件格式。

它通常在文件名中具有以下扩展名之一:none、.o、.so、.elf、.prx、.puff、.bin

  • 此外,对于 GNU 工具,源代码是免费提供的,请从 http://www.gnu.org/software/ 开始搜索 (3认同)

ori*_*ion 9

它是一个二进制可执行文件(编译成机器代码,就像大多数系统一样)。Shell 脚本更像是将部件连接在一起的“胶水”,以快速灵活地从现有内容中创建解决方案。这就是 *nix 的力量。

您需要源代码(c,有时是 c++,是 *nix 上最常见的语言),而不仅仅是编译后的可执行文件。由于它是开源的,您可以从在线存储库中获取所有代码(核心实用程序通常来自 gnu 项目)。但是,如果您不知道如何使用 git 或其他版本跟踪系统,那就有点棘手了。

这是 ls.c 文件,如果有帮助的话:http ://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c