不明白bash配置文件/etc/bashrc代码的含义

对于文件/etc/bashrc中的一段代码有疑问:

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

这里面最内部的if语句中的两个分支有什么区别? 重定向到/dev/null就意味着文件$i没被执行吗?

阅读 6.8k
5 个回答

为什么不去Google一番之后再来提问?

Shell 默认选项 himBH 的解释

我刚刚发现我也不会这个问题,所以我就去Google了一番,立马就出来了。如果你上不了Google,建议你去购买翻墙软件或者自己去外网购买搭建代理服务器

至于为什么会出现 >/dev/null,很简单,就是输出重定向。上面分支不会出现输出,下面分支会出现输出,/dev/null是一个类似黑洞的玩意,什么东西丢进去,就相当于删除掉了
你把上面链接中的文章看了,为什么知道为什么2个分支有的分支之后有的有输出,有的没有输出了

那个if就是判断当前shell是否是interactive的,是interactive的,输出不重定向,不是interactive,输出重定向到null。
加"-i"会启动一个interactive shell,"$-"变量是当前shell的选项,"${-#i}",是删除"$-"中到"i"的部分,所以如果"${-#i}" != "$-",说明选项中包含"-i",是interactive shell。

汗!或许是我表达不清楚?。。。。。。
我不是在问if在判断什么,那个我知道。我是在问不论if判断的结果是true还是false,这两个分支区别在哪,为什么这样写两个分支。

你可以参考下 centos 中的注释:

# Only display echos from profile.d scripts if we are no login shell
# and interactive - otherwise just process them to set envvars
for i in /etc/profile.d/*.sh; do
    if [ -r "$i" ]; then
        if [ "$PS1" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

. "$i" >/dev/null 的含义是 source 文件 $i 但是不显示输出。

作用就是读取profile.d/*.sh文件,至于/dev/null是避免source文件时会输出信息。
默认情况下profile.d/中的文件都是没有输出信息,也就是直接定义了一些变量;但是用户可能会自己在profile.d/下添加自定义的环境变量配置文件,例如我的系统中:

[root@3dzfiejazf ~]# cat /etc/profile.d/mysql.sh 
export PATH=$PATH:/usr/local/mysql/bin
echo ok
[root@3dzfiejazf ~]# source /etc/profile.d/mysql.sh
ok

上面的情况下,&>/dev/null就管用了:

[root@3dzfiejazf ~]# source /etc/profile.d/mysql.sh &> /dev/null
[root@3dzfiejazf ~]# 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题