![为什么有些非root程序可以双击执行,有些却不行?](https://linux22.com/image/908969/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%9C%89%E4%BA%9B%E9%9D%9Eroot%E7%A8%8B%E5%BA%8F%E5%8F%AF%E4%BB%A5%E5%8F%8C%E5%87%BB%E6%89%A7%E8%A1%8C%EF%BC%8C%E6%9C%89%E4%BA%9B%E5%8D%B4%E4%B8%8D%E8%A1%8C%EF%BC%9F.png)
答案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 会愉快地生成它。幕后还会发生很多其他事情,但这就是它的一般要点。