我正在制作一个可以从命令行调用的程序,例如./prog arg1 arg2
. 我想知道,我怎样才能使它可以从系统上的任何地方运行它?我知道我可以放入prog
,/usr/bin/
但是如果我的程序需要来自其安装目录的资源(可以是用户下载它的任何位置)怎么办?
4 回答
将您的程序所在的目录放入path
环境变量中,或者将您的程序移动到已经存在的目录之一中path
(通常需要超级用户权限,我认为您没有这个权限,那么您就不会问这个问题)。
将目录添加到搜索路径的前面并让系统刷新其数据库tcsh
,例如
setenv "my/directory:"$PATH
rehash
上bash
,我想,它是
PATH=/my/directory:$PATH
export PATH
(无需重新散列)。请注意,上面的命令将您的目录放在搜索路径的顶部,即这些将在任何其他之前搜索。因此,如果您的程序被称为“gcc”,那么您的程序将被执行而不是 GNU C 编译器。或者,您可以将您的目录添加到搜索路径的末尾,在这种情况下,只有在搜索路径中的任何其他目录中都没有找到同名的其他程序时,才会选择您的程序。
您可能还想熟悉Linux 文件系统层次结构:“什么去哪里”的标准定义。这里有更多信息:
环境变量可以全局定义(“针对所有人”,例如/etc/profile
),或本地定义(“每个用户”,例如~/.bashrc
)。以下是您的一些选项的一个很好的总结:
当您使用 执行程序时prog arg1 arg2
,这要归功于您的 shell,它在 $PATH 环境变量中搜索程序所在的文件夹。(尝试env | grep PATH
查看那些文件夹)。
您需要在此变量中添加一个新目录(export PATH="/new/directory/path/:$PATH"
如果在 bash 下,setenv PATH "/new/directory/path/:$PATH"
如果使用 tcsh)或复制您的程序和它需要在 PATH 文件夹之一中执行的所有文件。
有两种处理方法(Makefile 与它们无关)
您的安装程序可以将文件放在它想要的位置,因此您的程序不必搜索——它可以使用硬编码路径。或者您可以将数据目录的路径放入另一个文件中,该文件将被硬编码(如 /etc/programname.config)。
你把你所有的东西都放在一个目录中(通常是 /opt/programname 之类的)。当然,您也可以对其进行硬编码,或者您的程序可以 readlink() /proc/pid/exe 文件以获得很好的机会(但不能保证。特别是,例如,如果使用符号链接指向 / usr/bin/programname 到您的 /opt/programname/bin/programname 或其他任何内容,但如果这是硬链接,它将不起作用)来获取可执行文件的路径。从那里您应该能够访问您的数据文件。
如果更喜欢第二种解决方案,但这只是我。第一个解决方案适用于包管理器,如果您真的没有很多数据文件,它就不会那么矫枉过正。