它说
/etc/profile
文件在Bash shell启动时设置环境变量。 /etc/profile.d
目录包含其他脚本,这些脚本包含特定于应用程序的启动文件,这些启动文件在启动时也由外壳程序执行。对于Bash启动至关重要吗?如果这些文件是特定于应用程序的启动文件,对于Bash启动而言并不重要,那么为什么它们是启动过程的一部分?为什么仅在执行包含设置的特定应用程序时才运行它们?
#1 楼
如果这些文件对Bash启动也很重要,为什么这些文件不属于/ etc / profile文件?巨型脚本?”,答案是:
,因为这将是负责脚本的人员的维护噩梦。
因为将脚本作为独立的模块加载,使整个系统更具动态可调性-可以添加和删除单个脚本而不会影响其他脚本。等。
因为它们都是通过/ etc / profile加载的,所以无论如何它们都是bash“ profile”的一部分。特定的启动文件对Bash启动并不重要,那么为什么它们是启动过程的一部分?为什么
它们不只在执行包含它们的设置的特定应用程序时才运行?我将一分为二。第一个问题是关于使用Shell环境的价值和适当性。它有正面价值吗?是的,它很有用。它是解决所有配置问题的最佳解决方案吗?否,但是它对于管理简单参数非常有效,并且也得到广泛认可和理解。相比之下,决定异种地配置这些东西,也许$ PATH可以由单独的独立工具进行管理,首选工具(例如$ EDITOR)可以在某个地方的sqlite文件中,$ LC lang的东西可以在一个文本文件中,并带有一个自定义格式在其他地方,等等-不只是使用env变量,并且
/etc/profile.d
突然看起来更简单吗?您可能已经知道env变量是什么,它们是如何工作的以及如何使用它们,相对于学习5种完全不同的机制来了解适当命名为“环境”的5个不同普遍方面而言。第二个问题是“启动时间是否合适吗?”,这引起了反对,即效率不是很高(可能使用或可能不使用所有数据,等等)。但是:实际上,它并不是全部数据,部分原因是没有人在他们的头脑中将其用于多个简单参数(因为还有其他配置方法如果合理使用它,那么对于通常调用的东西,则每次调用
gcc
时,例如在某个位置的文件中设置默认$ CFLAGS效率就会降低。请记住,涉及的内存量也是无限的。 它可能涉及系统性的事物,可能涉及多个应用程序,而shell是一个共同点。有关该问题的利弊的信息-主要的“优点”和主要的“缺点”是它是全局命名空间。
#2 楼
这些文件特定于应用程序,但是在外壳启动时而不是在应用程序启动时来源。此处使用配置目录的原因与在其他许多地方都可以找到它的原因相同。这允许应用程序或软件包修改配置。如果没有拆分的配置,这将是不可能的,因为试图管理/更新单个配置文件(用户也可以对其进行修改)的多个程序包有很多错误和混乱。另外,
/etc/profile
来自所有shell,而不仅仅是bash。 bash特定的配置文件是bashrc,仅用于交互式shell。评论
第二段很有趣。由于不同的外壳程序支持不同的语法,因此这将需要一种有效的通用语法。对于bash和sh正确,但对于csh或tcsh之类的其他人,则不这么认为,它们都有自己的全局登录启动脚本。在许多系统上,/ bin / sh只是到/ bin / bash的链接。但是bash在作为sh调用时会将其行为修改为与posix兼容。因此,人们会认为/etc/profile.d中脚本的作者将需要小心,避免在posix子集之外使用bash扩展。
–sootsnoot
2014年10月10日在6:28
在linux下,两种主要的shell类型有单独的.csh和.sh文件。
–斯塔克
2015年1月13日14:25
不是所有的shell都处理/ etc / profile。 zsh没有。至少不是在debian 11上。
– RichieHH
20 Dec 6'在9:05
#3 楼
约旦的答案不正确。/etc/profile
并非来自所有shell。如您所指出的,它不是由csh
,tcsh
来源的-我不确定zsh
。它是由Bourne shell(sh
)派生的,如Korn Shell(ksh
)和BASH(bash
)衍生的。 csh
使用/etc/login
。倾向于只使用Borne Shell衍生物的人往往会忘记其他存在的shell。他们在/etc/profile
中添加了一些内容,希望将其应用于“所有用户”,然后当奇数C Shell用户(而且我们是一个奇数)没有/etc/profile
中配置的内容时感到惊讶。 >即使这样,人们也往往会忘记其他Borne Shell衍生壳的存在。如果他们使用bash
或ksh
,则可以随意向在Bourne Shell中无效的/etc/profile
添加语法,例如定义变量并将其导出到同一行。然后,您将获得执行#!/bin/sh
的脚本,并且该脚本在语法上令人窒息。 /etc/profile
应该遵循Bourne Shell兼容语法。 同样,您应该坚持自己的
.profile
(如果需要一些bash语法,请使用.bash_profile
)-可能需要额外输入一些内容,但是您可以一次完成所有额外输入。引用${HOME}
而不是~
等。某些类型的Unix,cron作业在sh
下运行,Makefile
的每一行都由sh
处理,因此,如果您使用的是UNIX的多种版本,那么保留.profile
Bourne shell确实是值得的兼容。作为SysAdmin,我无法告诉您我已经通过修复某人与bourne Shell兼容的问题帮助了多少人。在Linux上,
.profile
是/bin/sh
的链接,当您运行它时,它看起来是运行它的路径,并且(理论上)仅将其自身限制为Bourne Shell支持的内容。同样,Linux上的/bin/bash
实际上是vi
,再次限制了自身。有时,您会看到功能“渗漏”。有时候,假装为vim
的vim
会执行vi
支持vim
不支持的操作,因为vi
的作者忘记了在“ vi向后兼容”模式下禁用此功能。如果装作vim
的bash
具有一些类似的“渗漏”功能,我不会感到惊讶。如果某些功能“可在Linux上的Borne Shell上运行,但不能在基于System V或BSD的UNIX(AIX,OpenBSD等)上运行,则不会感到惊讶。评论
您确定“在Linux上/ bin / sh是到/ bin / bash的链接”吗?这是一个合理的声明。
– 41754
19-09-13在14:38
ZSh不在Debian中处理/ etc / profile。我在/ etc / zsh / zprofile中添加了源代码
– RichieHH
20 Dec 6'在9:07
评论
它有积极的...和了解。您想在这里说什么?我理解那段以外的所有内容。
–asheeshr
13年2月9日在14:22
外壳环境通常用于配置外壳本身和其他普遍使用的工具。这不是完成配置的唯一方法,因此值得考虑环境是比其他选择更好还是更坏。具有“积极价值”,我的意思是说使用环境似乎确实比其他选择具有一些优势,至少是WRT“管理简单参数”-即它非常有效并且“得到广泛认可和理解” ...我会再加一点解释这个词。
–金锁
13年2月9日在16:23
将行追加到profile.local怎么样?与在profile.d文件夹中创建脚本相比,这可以接受吗?
– Avindra Goolcharan
14年7月30日在18:32
@AvindraGoolcharan不同的发行版可能会对这种事情使用不同的方案。 profile.d目录仅能工作,因为其内容来自/ etc / profile,后者由bash等外壳程序指定为启动文件(请参见man bash中的INVOCATION);如果编辑/ etc / profile,则可以禁用/etc/profile.d。 /etc/profile.local似乎是SUSE的发明,大概是从/ etc / profile之类的地方获得的,以便您可以在其中放置自己的东西。但是,如果将其移至非SUSE系统并且未进行任何其他调整,则不会被任何人使用。
–金锁
14年7月30日在19:09
太清楚了。是的,我们在工作中使用SUSE。 / etc / profile。似乎是更好的选择。
– Avindra Goolcharan
2014年7月31日在22:49