`

shell相关-------各环境变量配置文件及对应的shell模式

阅读更多

■各配置文件

1./etc/profile

系统中每个用户登录时都要执行这个脚本,如果系统管理员希望某个设置对所有用户都生效,可以写在这个文件里

 

2.~/.bash_profile、~/.bash_login和~/.profile

这些是在当前用户主目录下定义的,其实主要是~/.bash_profile,其他两个一般好像不存在。

[root@localhost sabopeusr0]# ls -a ~
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .cshrc  .tcshrc  anaconda-ks.cfg

 

~/.bash_profile,如果希望某个设置只对当前用户生效,可以写在这个文件里。

由于这个脚本在/etc/profile之后执行,/etc/profile设置的一些环境变量的值在这个脚本中可以修改,
也就是说,当前用户的设置可以覆盖(Override)系统中全局的设置。

~/.profile这个启动脚本是sh规定的,bash规定首先查找以~/.bash_开头的启动文件,

如果没有则执行~/.profile,是为了和sh保持一致。

 

3.~/.bash_logout

在退出登录时会执行~/.bash_logout脚本(如果它存在的话)。

 

4.~/.bashrc

在图形界面下开一个终端窗口,或者在登录Shell提示符下再输入bash命令,就得到一个交互非登录的Shell。
这种Shell在启动时自动执行~/.bashrc文件并以fork子shell的方式执行,即继承父shell的环境变量,并依据.bashrc来修改,
执行完后本地变量不会保存到父shell中去。

[root@localhost sabopeusr0]# ps -ef|grep -v grep|grep bash
sabopeu+  8906  8905  0  7月26 pts/2  00:00:00 -bash
root     11223 11222  0 09:41 pts/2    00:00:00 bash
[root@localhost sabopeusr0]# bash
[root@localhost sabopeusr0]# ps -ef|grep -v grep|grep bash
sabopeu+  8906  8905  0  7月26 pts/2  00:00:00 -bash
root     11223 11222  0 09:41 pts/2    00:00:00 bash
root     11392 11223  0 13:00 pts/2    00:00:00 bash
[root@localhost sabopeusr0]#

 

有时为了使登录Shell也能自动执行~/.bashrc,通常在~/.bash_profile中调用~/.bashrc:
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
上面的意思是,如果~/.bashrc文件存在则source它。多数Linux发行版在创建帐户时会自动创建~/.bash_profile和~/.bashrc脚本,
~/.bash_profile中通常都有上面这几行。所以,如果要在启动脚本中做某些设置,使它在图形终端窗口和字符终端的Shell中都起作用,
最好就是在~/.bashrc中设置。

 

 

■Shell模式

1.交互式登录shell启动

/etc/profile,~/.bash_profile,~/.bash_login和~/.profile

 

1)以Bash的方式启动登录shell(/etc/passwd里定义的shell是/bin/bash,默认就是这种方式)

/etc/profile⇒~/.bash_profile⇒~/.profile

(~/.profile这个启动脚本是sh规定的,bash规定首先查找以~/.bash_开头的启动文件,如果没有则执行~/.profile,是为了和sh保持一致。)

 

2)以sh的方式启动登录shell(/etc/passwd里定义的shell是/bin/sh,默认就是这种方式)

如果以sh命令启动bashbash将模拟sh的行为,以~/.bash_开头的那些启动文件就不认了。

所以,如果作为交互登录Shell启动,或者使用--login参数启动,则依次执行以下文件:

/etc/profile⇒~/.profile

 

2.交互式非登录shell启动 

~/.bashrc

 

为什么登录Shell和非登录Shell的启动脚本要区分开呢?

最初的设计是这样考虑的,如果从字符终端或者远程登录,那么登录Shell是该用户的所有其它进程的父进程,也是其它子Shell的父进程,

所以环境变量在登录Shell的启动脚本里设置一次就可以自动带到其它非登录Shell里,

而Shell的本地变量、函数、alias等设置没有办法带到子Shell里,需要每次启动非登录Shell时设置一遍,

所以就需要有非登录Shell的启动脚本,所以一般来说在~/.bash_profile里设置环境变量,在~/.bashrc里设置本地变量、函数、alias等。

如果你的Linux带有图形系统则不能这样设置,由于从图形界面的窗口管理器登录并不会产生登录Shell,所以环境变量也应该在~/.bashrc里设置。

 

 3.非交互式启动

为执行脚本而fork出来的子Shell是非交互Shell,启动时执行的脚本文件由环境变量BASH_ENV定义,相当于自动执行以下命令:
    if [ -n "$BASH_ENV" ]; then
     . "$BASH_ENV";
     fi
如果环境变量BASH_ENV的值不是空字符串,则把它的值当作启动文件的文件名,source这个脚本。

 

通过sh,来fork非交互式shell,则

 if [ -n "$ENV" ]; then . "$ENV"; fi

 

一般来说,如果作为非交互Shell启动,则不执行任何启动脚本。通常我们写的Shell脚本都以#! /bin/sh开头,都属于这种方式。 

 

简单测试

 

[sabopeusr0-admin@localhost ~]$ grep tshell .bashrc
tshell="non-login shell will see this message"
export tshell
[sabopeusr0-admin@localhost ~]$ grep lshell .bash_profile
lshell="login shell will see this message"
export lshell
[sabopeusr0-admin@localhost ~]$ bash
[sabopeusr0-admin@localhost ~]$ echo $lshell

[sabopeusr0-admin@localhost ~]$ echo $tshell
non-login shell will see this message
[sabopeusr0-admin@localhost ~]$ exit
exit
[sabopeusr0-admin@localhost ~]$ bash --login
[sabopeusr0-admin@localhost ~]$ echo $lshell
login shell will see this message
[sabopeusr0-admin@localhost ~]$ echo $tshell
non-login shell will see this message
[sabopeusr0-admin@localhost ~]$

 

 

分享到:
评论

相关推荐

    <Linux>shell 脚本环境变量问题深层探索【实践+实验】

    Linux shell 脚本环境变量问题深层探索 shell 脚本环境变量是 Linux 系统中一个非常重要的概念,它对 shell 脚本的执行和调试产生了深远的影响。本文将深入探索 shell 脚本环境变量的问题,从实践和实验的角度来...

    Shell脚本-珍藏版

    系统文件章节包括了Linux系统目录结构、环境变量文件和系统配置文件等内容,学习者可以通过这些文件更好地了解和管理Linux系统环境。 常用的命令和工具章节则提供了丰富的命令行工具,这些工具几乎涵盖了系统管理的...

    实战Linux Shell编程与服务器管理-脚本文件.rar

    /bin/bash`(或对应Shell的路径),并赋予执行权限(`chmod +x script.sh`)。 8. **netmask_2_bits.sh**:可能是一个用于将网络掩码转换为位数的脚本,这在IP网络配置或路由计算中常见。例如,255.255.255.0对应的...

    PyPI 官网下载 | cloudshell-octopus-deploy-4.1.80.zip

    3. **变量管理**:库支持 Octopus Deploy 的变量系统,可以方便地在Python代码中处理和应用这些变量,确保不同环境下的配置差异得到妥善处理。 4. **工作流集成**:cloudshell-octopus-deploy库可以与现有的工作流...

    Linux中环境变量配置文件详解.docx

    1. **/etc/profile**:这是系统级的全局环境变量配置文件,当任何用户首次登录系统时,这个文件会被执行。它通常用来设置适用于所有用户的环境变量。此外,它还会从`/etc/profile.d`目录下的其他配置文件中读取并...

    JAVA环境变量配置步骤

    Java环境变量配置是Java开发和运行的基础,它涉及到PATH、JAVA_HOME、CLASSPATH等关键变量的设置。下面将详细介绍这些步骤以及相关知识点。 1. **JAVA_HOME**: 这是Java安装目录的路径,包含了JDK(Java ...

    unix shell awk 修改ini文件的脚本

    在Unix环境下,经常需要处理各种配置文件,其中.ini格式的配置文件非常常见。这类文件通常用于存储应用程序的设置信息,包括数据库连接、路径设置等。本文将深入探讨如何使用Unix shell与awk工具来编写一个脚本来...

    在Linux中用批处理设置环境变量的方法

    在Linux中设置环境变量,最常见的方法是在终端中使用export命令,但当需要一次性设置多个环境变量时,逐个敲入export命令显然效率低下,为此,可以采用批处理脚本的方式来高效配置。 首先,我们来解释一下什么是...

    编写shell管理脚本.docx

    - 可以轻松地处理文本文件,如配置文件和日志文件。 - 支持条件判断、循环等编程结构。 - **Shell脚本的应用场景**: - **系统监控**:定期检查系统状态并发送通知。 - **备份管理**:自动化备份关键数据和文件...

    shell-day3

    Shell中的作业也包含对变量的操作,如使用export关键字将变量导出为环境变量,理解局部变量、环境变量、shell变量之间的区别,以及进行变量替换。变量替换包括文件名替换、参数替换、命令替换、算术替换等,它们允许...

    Sams Teach Yourself Shell Programming in 24 Hours

    - 用户在登录时会加载特定的Shell环境配置文件,如.bashrc或.bash_profile。 - 这些文件用于设置环境变量、别名和其他个性化设置。 #### 二、文件操作与管理 ##### **2.1 文件操作基础** - **文件查看** - ...

    linux-shell学习笔记.pdf

    - 环境配置:设置和管理环境变量等。 #### 二、文件安全与权限 - **2.1 文件类型** - **普通文件**:存储数据的文件,通常具有扩展名。 - **目录**:用于组织文件和其他目录的容器。 - **链接**:软链接(符号...

    LINUX 与 UNIX SHELL编程指南

    以上总结了文档中提及的关于LINUX与UNIX SHELL编程的核心知识点,涵盖了文件操作、权限管理、文本处理、脚本编写、环境变量配置、工具使用等多个方面,适用于希望学习和提升shell编程技能的读者。

    LINUX里面的环境变量的配置

    ### LINUX中的环境变量配置详解 在LINUX操作系统中,环境变量是系统运行过程中用来存储配置信息的一种重要方式。对于刚接触LINUX的新手来说,掌握环境变量的配置方法至关重要。本文将详细介绍LINUX环境中环境变量的...

    西南科大+Linux实验报告+shell程序开发

    此外,还学会了配置环境变量、文件行数统计等实用技能。通过编写和分析Shell脚本,熟悉了循环、判断等控制结构,以及文件操作。在代码阅读过程中,对Linuxer的主要实现有了更深的理解,进一步提升了Linux系统管理和...

    Bash shell脚本新手指南

    - 对于外部命令,Shell会在PATH环境变量指定的路径中查找对应的可执行文件。 - 对于内部命令(如`cd`),Shell直接处理而不需查找。 - **脚本示例分析:** - 简单脚本通常包含一系列命令和逻辑结构。 - 例如,...

    linux shell 查询oracle数据库中的值 并返回

    可以使用环境变量或外部配置文件来安全地存储这些敏感信息。 9. **权限**:确保运行脚本的用户具有执行SQL查询和连接到Oracle数据库所需的权限。 10. **性能优化**:对于大数据量的查询,考虑使用绑定变量、索引、...

    Java环境变量配置展示

    Java环境变量配置是Java开发和运行的基础步骤,对于任何想要在本地系统上使用Java的开发者来说,理解并正确设置这些变量至关重要。Java环境变量主要包括JAVA_HOME、PATH和CLASSPATH,它们各自扮演着不同的角色,确保...

    Android执行shell命令(转)

    在Windows、Mac或Linux环境下,你需要先下载并安装Android SDK,然后配置环境变量,确保adb命令在终端中可直接使用。 2. 连接设备 使用`adb devices`命令检查已连接的Android设备。如果设备未显示,可能需要在...

Global site tag (gtag.js) - Google Analytics