在 Ubuntu 中安装东西的真正正确方法是什么?

在 Ubuntu 中安装东西的真正正确方法是什么?

我知道我应该使用 apt-get 来获取东西,但我要求获取不存在的二进制文件,或者我需要最新版本的二进制文件。每次我搜索如何在 Ubuntu 上安装这些二进制文件时,我都会得到不同的答案。当然,我可以将 bin 粘贴到 /bin 或 PATH 中已有的目录中,但许多应用程序都充满了其他文件,所以这应该不是最好的方法。我经常看到说明告诉我将应用程序的文件夹添加到 PATH 中,但如果我用这种方法安装 100 个应用程序会发生什么?我的 PATH 变量不会变得又大又乱吗?此外,我会将此 PATH 传递给我打开的每个应用程序,我不认为这是在 Linux 中安装东西的更好方法。

那么,哪种方法才是正确的?另外,如果这与 PATH 有关,那么正确的有什么方法可以将路径添加到 PATH 中?我总是看到很多方法,这让我很困惑。

我想一劳永逸地结束这一切,因为我厌倦了以不同的方式安装东西,我想以正确和最优雅的方式来完成它。

答案1

PATH 变量的用途

PATH是用于 shell 的 - 它告诉 shell 您输入的命令应该存放在哪里。我曾经拥有的 OpenSUSE 机器就是一个好例子。在 Ubuntu 上,您可以输入iconfig命令,然后 bash 会说“哦,我知道它在哪里 - 我会运行/sbin/ifconfig”。好吧,在 OpenSUSE 默认状态下PATH,没有/sbin添加到它,所以bash会说“对不起,我不知道它ifconfig在哪里,我没有此类文件的记录。”所以你必须运行/sbin/ifconfig(即完整路径)或以智能方式执行 - 添加/sbinPATH

一个很好的例子就是当您安装自定义脚本或二进制文件时。假设您在/opt/my_stuff文件夹中保存了某些内容,并且只想my_command按名称调用。好吧,您必须添加/opt/my_stuffPATH

如何正确地将目录添加到 PATH

基本思想是你想附加或者将原始$PATH目录与新目录合并。您可能知道也可能不知道,PATH变量中的项目以 分隔:。您还需要export变量,以便其他程序(您的 shell 的子程序)知道在哪里查找内容。所有这些事情都必须发生在 的末尾~/.bashrc,这样当您打开 shell 并且它读取了您的~/.bashrc配置时,它就知道所有内容的位置。

以下是我的例子~/.bashrc

export PATH=$PATH:"/opt/microchip/xc16/v1.25/bin"

在这种情况下,original$PATH将扩展为目录字符串。我们只需再添加一个目录,然后将其保存回去即可。没什么复杂的。

这与安装软件有什么关系

.deb如果您要从存档或脚本安装文件.run,则不必担心该PATH部分。简化安装过程是软件作者的责任。通常,他们会将安装配置为将内容保存到已属于的公共目录之一中PATH:安装脚本会说,“嘿,将此软件安装到 /usr/bin 中”,您将能够毫不费力地使用它。

如果软件作者将其安装在通常不在的地方PATH,他们将不得不配置您的PATH变量,或者您必须自己配置。在上面的例子中,该目录/opt/microchip是在我安装 Microchip 的 IDE 和编译器时创建的。他们的安装程序会自动将该行放入我的 中~/.bashrc。我经常编写进入 的脚本/opt,所以我通常会在说明中提到用户必须PATH自行配置。

~/bin 目录

您经常会看到有人建议将脚本和其他类型的软件保存到~/bin。此文件夹属于您(您的用户),因此如果您不想与计算机上的其他人共享应用程序,那么您可以将它放在那里。不同之处在于,/opt正如我在几个地方提到的那样,/opt是中立的。因此,如果我作为系统管理员希望我的家人也能使用他们的帐户访问应用程序,那么我会将它放在那里。

至于bashshell,它已经为您处理了~/bin添加PATH。其他 shell,如/bin/sh、 或tcshksh不会执行此操作,因此如果您在不同的系统上工作或想要在 Ubuntu 中使用不同的 shell,请记住这一点。

解决问题的具体部分

我经常看到一些说明告诉我将应用程序的文件夹添加到 PATH 中,但如果我用这种方法安装了 100 个应用程序,会发生什么情况?我的 PATH 变量会不会变得又大又乱?

不是真的 - 应该放入路径的是目录。如果您通常在单个目录中安装软件(例如~/bin/opt),则只需添加/opt。如果每个软件都必须位于 下的自己的文件夹中/opt,那么是的 - 您必须将每个软件都添加到PATH。但是,您可以编写一个脚本将所有目录添加到PATH。所以,假设:

$ for item in /opt/* ; do                                                                                      
 if [ -d "$item" ]; then
     PATH="$PATH:$item"
     echo "$VAR"
 fi
 done

这可以作为 末尾的函数完美地存在~/.bashrc,以便每次打开 shell 时,其下的所有目录/opt都会自动添加。

在我的例子中,我编写了许多脚本。它们全都位于其中,~/bin因为它们都是单个文件,因此无需位于单独的目录中。

另外,我会将此 PATH 传递给我打开的每个应用程序,我不认为这是在 Linux 中安装东西的更好方法。

这就是export变量的作用。它将内容传递给 shell 的子进程。作为用户,您无需执行任何操作。另外,正如我所提到的,这通常不会发生 - 软件作者创建的软件包会进入已经在的目录中,PATH例如/usr/bin

不存在的目录/opt只是一个中立的立场,也是开发人员说“嘿,我们的应用是第三方的,所以它不是默认的”的一种方式。

使用没有 PATH 变量的 GUI 应用程序

这里没有涉及的一件事是.desktop文件。简而言之,这些是 Linux 版本的 Windows 快捷方式,但功能更强大。假设我用 Python 构建了一个 GUI 应用程序,我希望它位于/opt文件夹中,但我不希望用户从命令行调用它 - 我希望他们使用一个漂亮整洁的桌面快捷方式。好吧,这就是文件发挥作用的地方.desktop。以下是一个例子:

$ cat /home/xieerqi/.local/share/applications/vivaldi.desktop                                                  
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Name=周迅 mv - YouTube
Icon=vivaldi
Path=/home/xieerqi
Exec=/opt/vivaldi/vivaldi-bin --ppapi-flash-path --ppapi-flash-version --always-authorize-plugins --enable-npapi --no-first-run
StartupNotify=false
StartupWMClass=Vivaldi
OnlyShowIn=Unity;
X-UnityGenerated=true

虽然vivaldi应用程序可以在 中正常运行/opt而无需在 中引用PATH,但我可以使用.desktop快捷方式来启动它。同样,您需要为每个应用程序手动创建一个,但正如您所猜测的,Linux 有脚本方法可以自动执行此操作。

结论

那么在 Linux 上安装软件的真正正确方法是什么?没有,就像在 Windows 或 Mac OS X 上没有方法一样。您的 Windows 应用程序可以是单个的,也可以是.exe带有文件夹的,.exe并且可以在文件夹中完美地存在C:\。同样,在 Linux 上,您可以将脚本或整套软件放在/opt~/bin或您选择的任何地方。当然,选择必须在某种程度上是合理的。您希望应用程序仅供root、 供您使用only,还是共享?您希望仅通过其名称即可访问它,还是要输入应用程序的完整路径?

附加信息

答案2

免责声明:以下内容仅代表我的个人观点。

在 Ubuntu 中,~/.profile有:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

这意味着如果该~/bin目录存在,则PATH在开始时将其添加到 , 中。

因此,应该将所有用户可执行文件放在~/bin目录中,这确保:

  • 可维护性
  • 清洁度
  • 用户特定PATH

此外,如果存在一些无法放入其中的可执行文件,您可以轻松地在此目录上创建指向该可执行文件的符号链接。

相关内容