Linux环境变量顺序

方式1:PATH=$JAVA_HOME/bin:$PATH方式2:PATH=$PATH:$JAVA_HOME/bin方式1可以在系统预先设置JAVA时使用用户新安装的路径... 方式1:PATH=$JAVA_HOME/bin:$PATH
方式2:PATH=$PATH:$JAVA_HOME/bin

方式1可以在系统预先设置JAVA时使用用户新安装的路径,方式2可以避免在JAVA_HOME的路径不存在或删除时避免PATH变量失效。

哪一种更好呢?是不是第一种更常用一些呢?
展开
 我来答
吴文昊襹
2014-07-11 · 超过58用户采纳过TA的回答
知道答主
回答量:110
采纳率:0%
帮助的人:142万
展开全部
内核启动的时候,各个驱动初始化的工作在文件init/main.c中的do_basic_setup()函数中做.
------------------------------------------------------------------------------------------------------
static void __init do_basic_setup(void)
{
/* drivers will send hotplug events */
init_workqueues();
usermodehelper_init();
driver_init();

#ifdef CONFIG_SYSCTL
sysctl_init();
#endif

/* Networking initialization needs a process context */
sock_init();

do_initcalls();
}
------------------------------------------------------------------------------------------------------
其中的driver_init()做一些核心的初始化,看看代码就明白了.
相应的驱动程序的初始化在do_initcalls()中做.
------------------------------------------------------------------------------------------------------
static void __init do_initcalls(void)
{
initcall_t *call;
int count = preempt_count();

for (call = __initcall_start; call < __initcall_end; call++) {
char *msg;

if (initcall_debug) {
printk(KERN_DEBUG "Calling initcall 0x%p", *call);
print_fn_descriptor_symbol(": %s()", (unsigned long) *call);
printk("\n");
}

(*call)();

msg = NULL;
if (preempt_count() != count) {
msg = "preemption imbalance";
preempt_count() = count;
}
if (irqs_disabled()) {
msg = "disabled interrupts";
local_irq_enable();
}
if (msg) {
printk(KERN_WARNING "error in initcall at 0x%p: "
"returned with %s\n", *call, msg);
}
}

/* Make sure there is no pending stuff from the initcall sequence */
flush_scheduled_work();
}
------------------------------------------------------------------------------------------------------
这个__initcall_start是在文件 arch/xxx/kernel/vmlinux.lds.S (其中的xxx 是你的体系结构的名称,例如i386)
这个文件是内核ld的时候使用的.其中定义了各个sectioin,看看就明白了。
在这个文件中有个.initcall.init, 代码如下:
------------------------------------------------------------------------------------------------------
__initcall_start = .;
.initcall.init : {
*(.initcall1.init)
*(.initcall2.init)
*(.initcall3.init)
*(.initcall4.init)
*(.initcall5.init)
*(.initcall6.init)
*(.initcall7.init)
}
------------------------------------------------------------------------------------------------------

这里有7个初始化的优先级,内核会按照这个优先级的顺序依次加载.
这些优先级是在文件include/linux/init.h 中定义的. 你注意一下宏 __define_initcall的实现就明白了.
相关代码如下:

#define __define_initcall(level,fn) \
static initcall_t __initcall_##fn __attribute_used__ \
__attribute__((__section__(".initcall" level ".init"))) = fn

#define core_initcall(fn) __define_initcall("1",fn)
#define postcore_initcall(fn) __define_initcall("2",fn)
#define arch_initcall(fn) __define_initcall("3",fn)
#define subsys_initcall(fn) __define_initcall("4",fn)
#define fs_initcall(fn) __define_initcall("5",fn)
#define device_initcall(fn) __define_initcall("6",fn)
#define late_initcall(fn) __define_initcall("7",fn)

我们可以看到,我们经常写的设备驱动程序中常用的module_init其实就是对应了优先级6:
#define __initcall(fn) device_initcall(fn)

#define module_init(x) __initcall(x);

文章出处:http://www.diybl.com/course/6_system/linux/Linuxjs/2008628/128990.html
请采纳。
力控科技
2024-08-19 广告
ForceSCADA是力控科技信创产品的重要组成部分,具备完全自主知识产权,支持部署在Linux桌面版、服务器版、嵌入式等系统架构下。使用ForceSCADA可以搭建创新性高、扩展性佳、融合度强的SCADA平台,进而构建高效、智能化的监控中... 点击进入详情页
本回答由力控科技提供
大大虫
高粉答主

2014-07-11 · 醉心答题,欢迎关注
知道大有可为答主
回答量:4.2万
采纳率:76%
帮助的人:1.4亿
展开全部
路径排前面的优先
比如 $JAVA_HOME/bin和/usr/bin下面都有java

PATH=$JAVA_HOME/bin:$PATH 时,执行 java的时候是$JAVA_HOME/bin/java,如果没有再执行/usr/bin/java
PATH=$PATH:$JAVA_HOME/bin 时,执行 java的时候是/usr/bin/java
一般用户设定都是为了特殊用途,使用方式2没什么意义,所以方式1多些
更多追问追答
追问
$JAVA_HOME/bin有点特殊,如果是

JAVA_HOME=/opt/java
JAVA_EXT=$JAVA_HOME/ext
PATH=$JAVA_EXT/bin:$PATH

第一种方式在JAVA_HOME失效时变成PATH=/ext/bin:$PATH,
这样问题就大了。这种情况下貌似第二种好一点吧?
追答
JAVA_HOME没设置,/ext/bin也没什么用,不影响PATH里其它路径的正常使用
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
茜拉密
2018-07-27 · TA获得超过1.7万个赞
知道小有建树答主
回答量:129
采纳率:88%
帮助的人:5.4万
展开全部

路径排前面的优先。

比如 $JAVA_HOME/bin和/usr/bin下面都有java。

PATH=$JAVA_HOME/bin:$PATH 时,执行 java的时候是$JAVA_HOME/bin/java,如果没有再执行/usr/bin/java PATH=$PATH:$JAVA_HOME/bin 时,执行 java的时候是/usr/bin/java。

一般用户设定都是为了特殊用途,使用方式2没什么意义,所以方式1多些。

内核启动的时候,各个驱动初始化的工作在文件init/main.c中的do_basic_setup()函数中做.

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lizhihong404
2014-07-11 · TA获得超过426个赞
知道小有建树答主
回答量:841
采纳率:0%
帮助的人:595万
展开全部
方式2更常用一些
追问
解释一下1楼bigbigtiger17所说的版本优先问题的应对?
追答
其实都行,我用linux很多年了,相信我,一般情况下出问题的可能性非常低。不用太过于纠结这个
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式