Jey*_*ath 19 shell executable architecture
我对 *nix 有一些疑问。
我不知道是哪种类型的可执行文件ls
,无论是 .sh 还是 .ksh 或任何其他类型的系统可执行文件(如果是),那是什么?
当我试图查看ls
命令的源代码是什么样子时,它显示了一些不可读的东西,*nix 使用什么方法来创建这些类型的不可读文件,我可以使我的文件类似于这些文件(例如ls
- 不可读)。
slm*_*slm 31
您可以使用file
command 和type
command确定 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 是一种文件格式,它是gcc
诸如ls
.
在计算中,可执行和可链接格式(ELF,以前称为可扩展链接格式)是可执行文件、目标代码、共享库和核心转储的通用标准文件格式。
它通常在文件名中具有以下扩展名之一:none、.o、.so、.elf、.prx、.puff、.bin
它是一个二进制可执行文件(编译成机器代码,就像大多数系统一样)。Shell 脚本更像是将部件连接在一起的“胶水”,以快速灵活地从现有内容中创建解决方案。这就是 *nix 的力量。
您需要源代码(c,有时是 c++,是 *nix 上最常见的语言),而不仅仅是编译后的可执行文件。由于它是开源的,您可以从在线存储库中获取所有代码(核心实用程序通常来自 gnu 项目)。但是,如果您不知道如何使用 git 或其他版本跟踪系统,那就有点棘手了。
这是 ls.c 文件,如果有帮助的话:http ://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c