于是我就在看书Linux 命令行,它说命令有四种类型:
(1)可执行程序
(2) shell 内置函数
(3) shell函数(shell脚本)
(4) 别名
然后它说为了识别命令的类型,可以使用该type
命令。
但是,我注意到该type
命令无法区分 shell 函数(shell 脚本)和可执行命令。
例如:
type cp
(will output: cp is /bin/cp)
type bzexe
(will output: bzexe is /bin/bzexe)
但是,我们都知道它cp
是一个可执行程序,并且bzexe
是一个shell脚本。
所以我现在的问题是:我们可以使用什么命令来区分这两者?
我确实知道这个file
命令,而且它工作得很好。这是唯一的解决方案吗?
答案1
一个 shell 脚本是一个可执行程序。这就是为什么type
说它是一。 shell 脚本与 perl 脚本、python 脚本、本机 ELF 可执行文件、Qemu 通过 Linux 执行的跨架构可执行文件一样都是可执行命令binfmt_misc任何可执行文件都是可执行命令,无论它使用什么解释器。
正如您从我的示例列表中可以看出的那样,“脚本”和“非脚本”之间的界限是模糊的:任何以舍邦是一个脚本,但也有一些可执行文件既不是本机代码也不是脚本。
当您执行程序时,它是用什么语言编写的并不重要。所以type
告诉你这件事是没有意义的。的作用type
只是从 shell 的角度告诉您它是什么类型的命令。
shell 脚本与函数不同。函数在 shell 内部运行,并且可以修改 shell 的环境。 shell脚本是一个独立的程序;这个单独的程序可能碰巧是用与您现在运行的程序相同的语言编写的,但这只是巧合。
答案2
您想要的命令是file
.
type /bin/bash
/bin/bash is /bin/bash
file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, stripped
type /bin/zcat
/bin/zcat is /bin/zcat
file /bin/zcat
/bin/zcat: POSIX shell script, ASCII text executable
编辑:抱歉,我刚刚读了你帖子的最后一行。 file
不是唯一的选择,但可能是最好的。您还可以使用类似的方法head
来查看文件是纯文本还是二进制文件,但这很快就会变得混乱:)