type 命令无法区分可执行命令和 shell 脚本

alk*_*ary 4 command-line shell executable shell-script shell-builtin

所以我正在阅读The Linux Command Line一书,它说命令有四种类型:

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

但是,我们都知道它cp是一个可执行程序,bzexe是一个shell脚本。

所以我现在的问题是:我们可以使用什么命令来区分这两者?

我知道这个file命令,它工作正常。这是唯一的解决方案吗?

Gil*_*il' 22

shell 脚本一个可执行程序。这就是为什么type说它是一个。shell 脚本与 perl 脚本、python 脚本、本机 ELF 可执行文件、Qemu 通过 Linux 的binfmt_misc机制执行的跨架构可执行文件等一样是可执行命令。任何可执行文件都是可执行命令,它不是不管它使用什么解释器。

从我的示例列表中可以看出,“脚本”和“非脚本”之间的界限是模糊的:任何以shebang开头的可执行文件都是脚本,但有些可执行文件既不是本机代码也不是脚本.

当你执行一个程序时,它是用什么语言编写的并不重要。所以type告诉你这件事是没有意义的。的工作type只是从 shell 的角度告诉你它是什么类型的命令。

shell 脚本与函数不同。一个函数在shell 内部运行,并且可以修改shell 的环境。shell 脚本是一个单独的程序;这个单独的程序可能碰巧与您正在运行的程序使用相同的语言编写,但这只是巧合。


Dav*_*ing 7

你想要的命令是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
Run Code Online (Sandbox Code Playgroud)

编辑:抱歉,我刚刚阅读了您帖子的最后一行。 file不是唯一的选择,但它可能是最好的。您也可以使用类似的东西head来查看文件是纯文本还是二进制文件,但这会很快变得混乱:)