为什么有些非root程序可以双击执行,有些却不行?

为什么有些非root程序可以双击执行,有些却不行?

比如我找到了 Firefox 的进程命令行:/usr/lib/firefox/firefox,我浏览到这个位置,双击,会提示如下:

在此处输入图片描述

但是,如果我在终端中输入命令,它可以正常工作。

答案1

原因很简单,文件管理器可以识别文件类型。如果您双击/usr/share/applications/firefox.desktop或任何其他.desktop文件,文件管理器将把它作为应用程序执行。否则,文件管理器会查找哪种文件类型对应于哪个应用程序。

这就是它的作用/usr/lib/firefox/firefox。它被编译为共享对象。

$ file   /usr/lib/firefox/firefox
/usr/lib/firefox/firefox: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=d2a4bfe9dbe1aadd5480a6b5612b7a3fc1fd01a2, stripped

这种类型的文件已在kos 的回答,但共享对象基本上是一个可执行文件,可以用作库。库通常包含在其他软件中,因此 Nautilus 可以忽略它,并且不会为其分配默认程序。相比之下,shell(或更确切地说是内核,调用会将该execve()文件的路径传递给它)可以很好地将其识别为可执行文件。

现在,执行时会执行什么firefox.desktop?那就是/usr/bin/firefox.sh- 一个包装器脚本,它会进行一些检查,并在/usr/lib/firefox/firefox稍后用 替换自身。在本例中,shell 脚本被检测为文件类型,Nautilus 会愉快地生成它。幕后还会发生很多其他事情,但这就是它的一般要点。

相关内容