您的位置:首页 > 运维架构 > Shell

一个PATH引出的问题 - 交互式shell和非交换式shell区别

2017-03-03 23:46 302 查看
一个PATH引出的问题

用集群投递任务时,发现在Linux的PATH里面设置了变量 export A=“a”,  提交任务到计算节点后,发现变量$A是空,我凌乱了,于是问题来了。。。

1,任务节点配置相同,提交后怎么没了?

于是我用qrsh交互式登陆试试,看看能发现什么吗?

qrsh登陆后,发现$A=a,

发现不像是任务节点环境的问题,反正他们执行了不一样的东西,难道是非交互运行的问题,于是我做了一下确认

2,要识别一个shell是否为login shell,只需在该shell下执行echo $0:

# echo $0

如果输出为该shell名字,加上一个'-'前缀,则说明该shell为login shell。例如-bash,-su等等。

输入echo $0,得到的是"bash",说明这不是一个login shell。
经测试,任务节点确实为非交互式shell

3,于是我开始找交互式和非交换shell区别

当bash以login shell启动时,

它会执行/etc/profile中的命令,然后/etc/profile调用/etc/profile.d目录下的所有脚本;然后执行~/.bash_profile,~/.bash_profile调用~/.bashrc,最后~/.bashrc又调用/etc/bashrc。

当以非login方式启动时,

它会调用~/.bashrc,随后~/.bashrc中调用/etc/bashrc,最后/etc/bashrc调用所有/etc/profile.d目录下的脚本。

于是我查看~/.bashrc 中的$A配置,在其中发现了下面一段代码

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
[ -z "$PS1" ] && return


也是就是说,如果非交互shell,就return了。下面的代码就不运行了。

于是呢,我把$A=“a”放在上这部分代码的前面,那非交换shell应该也能运行了
经测试,发现推理无问题。解决问题

参考链接  http://www.2cto.com/os/201507/416675.html

参考链接  http://blog.chinaunix.net/uid-26918227-id-4938474.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  非交换shell