程序包管理器是否应该修改您的.bashrc文件?


9

我正在编写一个程序包,该程序需要设置环境变量才能正确执行。软件包管理器的安装步骤是应该修改用户的环境,还是只是提示用户自己进行修改?我的直觉是后者,但我可以看到前者的论点。


7
您能否使某些行为表现得更好,消除对环境变量的依赖(例如,改用配置文件)?.bashrc我认为,这比打包hack或与之混为一谈。

是的,但是出于这个问题的目的,我们不能修改应用程序。
大卫·考登

1
如果用户不在运行bash怎么办?有许多可供选择的外壳,其中包含各种启动文件。我认真建议在这里找到一些替代解决方案。
2014年

10
因此,在其周围写一个包装纸。例如,参见,tomcat它需要几个环境变量才能正常运行;请参见。它们都由运行的启动脚本设置,而不是直接运行其二进制文件。
Jules 2014年

1
@Vality我知道。朱尔斯的建议已经被提出。我很滑稽-嘲笑所涉及的循环逻辑,首先要说我应该有一个不可知的Shell解决方案,然后建议我使用Shell脚本作为解决方案。这是个玩笑(;
大卫·考登

Answers:


18

软件包管理器的安装步骤是应该修改用户的环境,还是只是提示用户自己进行修改?

都不行 软件包安装程序切勿触摸该软件包不拥有的帐户的主目录中的任何内容。软件包还应自行配置,以便安装后即可使用,而无需用户方面的任何特殊工作。(在某些特殊情况下,您不想执行此操作,但是这种情况很少且相差很远。)

在Unixy环境中,有一个放置配置文件的位置,该配置文件在用户启动登录Shell时会读取。对于Bourne和C shell,可以将配置分别插入/etc/profile和中/etc/csh.cshrc。(不要忘记在卸载时将其删除。)

许多系统还支持使用单个文件来执行此操作,这使得添加和删除配置位变得更加容易,而不必将文本放入一个文件中的任意位置。(它还为您提供了从程序包管理器获得的所有控制和责任优势。)某些发行版将配置为/etc/profile读取所有匹配的文件/etc/profile.d/*.sh


1
从历史上看,rc脚本名称源自CTSSruncom (运行命令),但此后范围扩大到包括其他含义。
杰弗里·汉汀

1
@JeffreyHantin:Touché。已移除。
Blrfl 2014年

1
讨厌继续采摘,但profile.d并没有内置在bash中,这是通常从发行版提供的一个钩子/etc/profile。;)
Jeffrey Hantin 2014年

1
@JeffreyHantin:的确如此,尽管我使用“ Unixy”一词不会受到批评。:-)
Blrfl 2014年

14

这是从未接受修改用户的/home从包管理结构,除非该修改是整个点。

主要方法是:

  • 通知用户他们需要配置它。
  • 提供默认值,因此不需要
  • 打包启动器脚本,以适当设置值
  • (如果发行版支持),将文件导出到环境变量中/etc/profile.d。在某些linux系统上,此目录中的所有脚本均来自默认的shell设置,因此您可以在此安全地设置变量。

7

问题软件包管理器的安装步骤是否应该修改用户的环境?

回答否。修改用户数据(在本例中为.bashrc文件)不是一个好主意。包裹管理者应该认为用户的数据是神圣的?

问题软件包管理器的安装步骤是否应该提示用户自己进行安装?

答案这是更可口的解决方案,但仍不理想。

我认为您应该创建一个包装器外壳脚本,在其中可以设置必要的环境变量,然后在它们之后运行可执行文件。


我也考虑过这个想法。该项目尚处于起步阶段,将达到不必要的地步。
大卫·考登

@ GlenH7我更新了我的回复。希望更新后的答案是您正在寻找的更多答案。
R Sahu 2014年

@ GlenH7:这个问题本质上是一个XY问题:meta.stackexchange.com/questions/66377/what-is-the-xy-problem,其中对环境变量的需求是要解决的真正问题。
whatsisname 2014年

此外,此答案关于创建包装脚本的建议是适用于所有shell的唯一答案。
whatsisname 2014年

1
@MattThomason意识到是促使我实际提出这个问题的原因(;
David Cowden 2014年

5

您错过了树木的森林。显然,为用户执行环境更改更方便,但同时也更具风险和侵入性。您应该通过询问用户安装程序是否应该修改安装程序.bashrc,并结合使用说明,结合使用这两个方面的优点,并给出说明他们自己应该如何执行操作。


感谢您的建议。我以前从未写过公共软件包,只是想确保我不做忌讳。
大卫·考登

谷歌云SDK今天就是这样处理的。它询问您是否要修改启动文件。
2014年

1

您假设“用户”是单数。如果我在该系统上有成千上万的用户,该怎么办?

您假设甚至可以找到用户的主目录。如果通过例如LDAP来管理用户,则甚至可能不允许您获取所有有效用户的列表。主目录可能不在/ home中;它们可以从网络动态安装。用户的主目录可能已加密,并且在他们未登录时无法访问密钥。

在任何可能的情况下都无法可靠地执行此操作。使用发行版的机制为用户登录或生成shell时设置环境变量。如果那不起作用,请编写一个包装器。(如果需要,包装程序可以是二进制的,以解决注释中的参数)。


0

如果一个全局变量是由您自己的项目定义的,则可以在程序包中设置一个全局变量(这意味着该项目的名称是该变量名称的一部分!)。即使那样,您也不应触摸用户的.bashrc文件,而应将脚本添加到/etc/profile.d

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.