像ls这样的系统命令是如何创建的?


19

我对* nix有一些疑问。

  • 我不知道哪种可执行文件是ls.sh或.ksh或其他类型的系统可执行文件,那是什么?

  • 当我尝试查看ls命令的源代码是什么时,它表明某些内容不可读,* nix使用什么方法来创建这些类型的不可读文件,并且可以使我的文件类似于这些文件(例如ls-不可读)。



4
我认为它与上面的URL更相关,而不是重复。
slm

Answers:


31

您可以使用和file命令确定Unix中可执行文件的性质type

类型

您可以type像这样确定可执行文件在磁盘上的位置:

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

因此,我现在知道它ls位于系统上的两个位置:/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

注意:您可以使用cmp或确认其大小相同diff

与差异
$ diff -s /usr/bin/ls /bin/ls
Files /usr/bin/ls and /bin/ls are identical
与cmp
$ cmp /usr/bin/ls /bin/ls
$ 

使用档案

如果我使用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

因此,这些都是从C / C ++编译的实际物理程序。如果它们是shell脚本,则通常会这样显示file

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

什么是ELF?

ELF是一种文件格式,它是诸如的编译器的输出,gcc用于编译C / C ++程序(如)ls

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

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


@lgeorget-有关使用类型vs.的技巧,请参见以下问答:unix.stackexchange.com/questions/85249/…。通常最好只type在您愿意使用which或的任何地方使用whereis
slm

3
此外,对于GNU工具,源代码是免费提供的,请在gnu.org/software中
glenn jackman 2014年

对于相同的测试,您确实应该使用类似md5sum或的工具sha1sum,而不仅仅是检查文件的大小和时间。
鲍勃

@Bob-那些相同的文件与Q无关,所以我展示了一种简单的方法。为了比较文件,我将使用更合适的工具,例如cmp,用于比较二进制文件。还希望查看它们提供的软件包将表明它们是否相关。它们都是它们的一部分,coreutils-8.21-13.fc19.x86_64我只是从处理Red Hat版本的20年中就知道它们是相同的。
slm

@Bob-有关更新文件的示例,请参阅更新。
slm

9

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

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

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


哦,并澄清一下如何创建二进制应用程序的问题:在无数种编程语言中进行选择(除了一对解释或半解释的语言,例如python,java,javascript,...传统上不会产生独立可执行文件的语言)二进制文件)。然后学习使用该语言以及如何进行编译。
Orion 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.