![可执行文件的执行路径。它是否取决于可执行文件的调用位置?](https://linux22.com/image/1035632/%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E7%9A%84%E6%89%A7%E8%A1%8C%E8%B7%AF%E5%BE%84%E3%80%82%E5%AE%83%E6%98%AF%E5%90%A6%E5%8F%96%E5%86%B3%E4%BA%8E%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E7%9A%84%E8%B0%83%E7%94%A8%E4%BD%8D%E7%BD%AE%EF%BC%9F.png)
由于我还是 Linux 的新用户,我仍然发现一些行为,但无法判断它们是否是“正常”行为。我搜索了互联网,但找不到答案,我想是时候在这里提问了。
几周前,我安装了一款名为“Machinarium”的小游戏,并开始玩它……但几天后,当我想继续玩游戏时,却无法让游戏正常启动。由于我没有时间搜索,所以我放弃了。
但昨天我在开发自己的程序时,遇到了完全相同的情况。于是我搜索了一下,发现当我使用 Nautilus 的“列表视图”时,当我真正“进入”时,我可以运行该程序(即程序确实找到了声音、图像等资源)可执行文件夹,但我却无法在父文件夹中并将其展开到可执行文件夹来运行它。
为了说明这种行为,这里有两个屏幕截图。
- 它不起作用如果从这里双击可执行文件
- 它确实有效如果从这里双击可执行文件
这确实是同一个“地方”,但由于当前文件夹不一样,Nautilus 视图略有不同,而且它似乎对程序产生了影响。
此外,当我通过以下方式创建菜单项时系统设置/主菜单对于可执行文件,它的行为就像可执行文件找不到资源一样(这就是为什么我无法第二次玩 Machinarium,因为我在第一次游戏后创建了一个菜单快捷方式)。
因此,我要求程序在运行时在其根目录下生成一个文本文件,然后我开始从不同的“父”文件夹启动它,以查看文本文件生成的位置。每次文件都生成在当前 Nautilus 视图的顶部文件夹中。
我希望看到它出现在可执行文件的同一文件夹中(当然,并不是因为我猜测发生了什么,但在此之前我希望看到它出现在 exe 文件夹中)。
- 有人可以向我解释为什么它会这样工作吗(我猜这是正常的)?
- 在创建程序时我应该如何解决这个问题(我应该检测 C++ 代码中的可执行路径,还是应该以不同于 Windows 的方式组织资源文件?)
答案1
这里有一个很好的问题,答案可以让你了解在哪里安装用户应用程序。
要运行应用程序,必须设置可执行位。 也可以通过 Nautilus 的右键菜单 (属性 -> 权限)。
然后,您可以通过双击 Nautilus 或在终端中运行以下命令来运行任何可执行二进制文件或脚本(请注意./
运行命令):
./path/to/executable/application
如果您的应用程序需要在其路径中运行,那么您需要首先通过执行以下命令将目录更改为此路径:
cd /path/to/executable
./application
为了简化此操作,您还可以创建一个启动器来运行该应用程序(例如这个答案以及其他许多人)
这就是我在 Machinarium 中所做的。
不建议将您自己的用户自定义文件放入/usr/bin
。如果您以后升级系统,此目录可能会被覆盖,并且它通常不包含在备份解决方案中。相反,请在您的主目录中创建一个新目录:~/bin
。您需要重新登录才能识别此目录。
答案2
是的。PATH 包含您输入命令时搜索的路径列表。如果您希望执行不在路径中的命令,则需要提供相对或绝对路径(例如./file
或)。bin/file
此行为可能是一个错误。应用程序可能在其某个目录中执行一些文件(bin/
例如),但假设该文件是从 machinarium 根目录执行的(调用bin/file
假设目录位于当前目录中),因此如果您从另一个目录运行它,则将找不到该文件。
一种解决方法是在 PATH 中创建一个脚本,该脚本进入 machinarium 目录,然后执行它。
#!/bin/bash
cd /path/to/machinarium
./machinarium-or-whatever
只需将其命名为 machinarium 并将其放在您路径中的目录下(/usr/local/bin 或 /home 中的目录)。然后您可以从任何目录运行该命令。