ubuntu下关于profile和bashrc中环境变量的理解(转)
ubuntu下关于profile和bashrc中环境变量的理解(转)
(0) 写在前面
有些名词可能需要解释一下。(也可以先不看这一节,在后面看到有疑惑再上来看相关解释)
$PS1和交互式运行(running interactively): 简单地来说,交互式运行就是在终端上输入指令运行,非交互式运行就是执行sh文件。交互式运行的时候echo $PS1会输出一长串字符。非交互式运行echo $PS1,会输出#或$。$代表普通用户,#代表root。非交互式运行是不会执行bashrc文件的配置内容的,这点需要注意一下,因为平常都在终端上执行指令,很容易忽略这一点:在bashrc中配置的东西,在执行sh文件的时候就失效了。
启动bash shell:就是启动一个bash shell进程,通常可以理解为打开一个终端。需要注意的是如果你在终端输入sh后会发现自己又进入另一个shell命令行(注意这不是交互式运行,可以echo $PS1验证),这个时候其实fork了一个shell 子进程(会复制一份原终端shell进程的全局变量),如果你在这个shell命令行又输入了一次sh,那么相当于fork的shell子进程又fork了一个shell子进程,这个时候就启动了三个bash shell进程。
输入exit或者ctrl-d可以退出当前shell,这里需要连续exit两次才可以回到原来的终端shell进程(这个时候就变回一个shell进程了)。
source profile或source bashrc:source一个sh文件,就是把sh文件的内容加载到本shell环境中执行。可以理解为:执行sh是非交互式运行;在终端source sh文件,相当于在终端执行sh文件的指令,就是交互式运行了。
(1) profile和bashrc
配置环境变量一般在这两种文件中。先讲讲什么时候执行,后面再介绍这两种文件做了什么。
profile在系统登录后执行,只在登录系统时执行一次,包括针对系统的/etc/profile和针对用户的~/.profile。
bashrc在每次启动bash shell(打开终端或者在终端输入sh)后执行,包括针对系统的/etc/bash.bashrc和针对用户的~/.bashrc(这里注意一下我的ubuntu里是/etc/bash.bashrc,其它系统可能是/etc/bashrc)
cat /etc/profile
cat /etc/bash.bashrc
cat ~/.profile
cat ~/.bashrc
(2) 环境变量
因为要配置环境变量,所以要对环境变量有所了解。shell中的环境变量分为全局变量和局部变量。
blogger="piligrimHui" 这样定义的为局部变量
export blogger="pilgrimHui" 这样定义的为全局变量(export这个变量,则升级为全局变量)
2.1 局部变量:父进程定义的局部变量,子进程无法访问;子进程定义的局部变量,父进程无法访问。

# parent.sh
#!/bin/bash pid="parent"
sh child.sh
echo "父shell访问子shell的cid:$cid"

# child.sh
#!/bin/bash echo "子shell访问父shell的pid:$pid"
cid="child"
sh parent.sh 子shell访问父shell的pid:
父shell访问子shell的cid:
2.2 全局变量:父shell定义的全局变量,子shell自身会复制一份父shell的全局变量,所以子shell对全局变量的操作不影响父shell的全局变量。子shell定义的全局变量,父shell不可用。

# parent.sh
#!/bin/bash export name="parent"
echo "父shell的name:$name"
sh child.sh
echo "子shell修改name之后,父shell的name:$name"
echo "父shell访问子shell定义的nickName:$nickName"


# child.sh
#!/bin/bash echo "子shell的name:$name"
name="child"
echo "子shell修改name后,子shell的name:$name"
nickName="baby"


sh parent.sh 父shell的name:parent
子shell的name:parent
子shell修改name后,子shell的name:child
子shell修改name之后,父shell的name:parent
父shell访问子shell定义的nickName:

(3) profile做了什么
登录shell随着用户的登录而启动,可以看作是第一个shell,后续的shell都是登录shell的子shell。
登录shell会执行针对系统的/etc/profile和针对用户的~/.profile。为了让环境变量在后续的所有shell都能访问到,可以在这里配置全局的环境变量,但是注意profile只会在登录的时候执行一次,所以一般配置完后需要重新登录才能生效。(虽然可以自行source profile但是只在当前shell进程有效,这里的shell进程可以理解为在一个终端里,但是如果在终端里输入sh其实相当于开了两个shell进程,一个父进程一个子进程)
对于/etc/profile,首先会检查是否交互式运行(即$PS1不为空),如果不是则给PS1赋’#‘或'$','#'代表root用户,'$'代表普通用户。如果是交互式运行还要是否启动了bash shell,如果是则执行/etc/bash.bashrc对bash进行相关配置。然后会执行/etc/profile.d目录下的shell文件,有一些作为自启动程序,有些用来定义一些全局环境变量。
对于~/.profile,首先检查是否启动了bash shell,如果是则执行~/.bashrc对bash进行相关配置。然后重新设置了PATH(所以导致不同用户的环境变量PATH不一样)。

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...). if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi


# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package. # the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022 # if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi # set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

(4) bashrc做了什么
当启动bash shell(打开终端)的时候会执行/etc/bash.bashrc和~/.bashrc。
在执行/etc/profile和~/.profile时如果检查到bash shell执行的话(对于/etc/profile还要先检查是否交互式运行),也会执行这两个文件。
我们来看看这两个bashrc做了什么
对于/etc/bash.bashrc:首先检查是否交互式运行,不是就什么都不做。是的话,后面是一堆乱七八糟的操作。
对于~/.bashrc:首先检查是否交互式运行,不是就什么都不做。是的话,后面一堆乱七八糟的操作,其中有一些别名操作,我们平常用的ll就是在这里设置了,是ls -alF的别名。
因为每次启动shell进程这里都会执行,所以一般也可以在这后面配置环境变量。
最常见的配置方法是vim ~/.bashrc然后在最后几行加上环境变量的配置,然后source ~/.bashrc或者重启终端即可。

# System-wide .bashrc file for interactive bash(1) shells. # To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile. # If not running interactively, don't do anything
[ -z "$PS1" ] && return ...


# ~/.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
case $- in
*i*) ;;
*) return;;
esac ... # some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

(5) 其它
echo $PATH # 查看环境变量PATH
(6) 写在后面
最后说一下,各个linux系统下的profile文件和bashrc文件都有所不同,我用的是ubuntu16.04,其它系统可能有所不同,可以自己看里面的shell代码进行理解和实践验证。
此次总结大致理顺了一下整个环境变量的“流通过程”,理解这个过程之后思路应该清晰了很多。
ubuntu下关于profile和bashrc中环境变量的理解(转)的更多相关文章
- ubuntu下关于profile和bashrc中环境变量的理解
(0) 写在前面 有些名词可能需要解释一下.(也可以先不看这一节,在后面看到有疑惑再上来看相关解释) $PS1和交互式运行(running interactively): 简单地来说,交互式运行就是在 ...
- Ubuntu下安装配置android sdk及其环境变量
同理,这里介绍的是手动安装方法~ *系统;Ubuntu 16.4 1.下载Android sdk,直接在系统自带的firefox浏览器输入 http://tools.android-studio.or ...
- Ubuntu下JDK1.8安装后配置环境变量
export JAVA_HOME=/dengyang/jdk1.8.0_56export JRE_HOME=$JAVA_HOME/jreexport CLASSPATH=.:$JAVA_HOME/li ...
- Ubuntu下实用命令收集 --新增 删除 环境变量
1. 关闭防火墙: sudo ufw disable 2. 设置IPV4地址和网关: ifconfig eth0 up %s netmask %s route del default gw 192.1 ...
- Ubuntu下搭建Hyperledger Fabric v1.0环境
多次尝试才正常启动了Fabric,如遇到各种莫名错误,请参考如下一步步严格安装,特别用户权限需要注意. 一.安装Ubuntu16 虚拟机或双系统,虚拟机有VirtualBox或者VMware,Ub ...
- Ubuntu杂记——Ubuntu下Eclipse搭建Maven、SVN环境
正在实习的公司项目是使用Maven+SVN管理的,所以转到Ubuntu下也要靠自己搭环境,自己动手,丰衣足食.步骤有点简略,但还是能理解的. 一.安装JDK7 打开终端(Ctrl+Alt+T),输入 ...
- (4)Linux(ubuntu)下配置Opencv3.1.0开发环境的详细步骤
Ubuntu下配置opencv3.1.0开发环境 1.最近工作上用到在Ubuntu下基于QT和opencv库开发应用软件(计算机视觉处理方面),特把opencv的配置过程详细记录,以供分享 2.步骤说 ...
- 【转】在Ubuntu下建立Eclipse的Android开发环境
本文将介绍如何建立Ubuntu下基于Eclipse的Android开发环境的方法. 大部分的Android开发者都是使用Eclipse来开发Android,本文将向各位介绍一下建立Ubuntu下基于E ...
- 在Ubuntu下搭建ASP.NET 5开发环境
在Ubuntu下搭建ASP.NET 5开发环境 0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要做成 ...
随机推荐
- [Tableau] Tableau for BI
主要链接 Tableau AWS 上的 Tableau Server Tableau on AWS Quick Starts Tableau教程[本篇来源] Tableau Desktop for U ...
- [LeetCode] 358. Rearrange String k Distance Apart 按距离k间隔重排字符串
Given a non-empty string str and an integer k, rearrange the string such that the same characters ar ...
- 【Python学习之八】设计模式和异常
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.设计模式1.单例模式确保某一个类只有一个实例, ...
- Kubernetes 使用 ingress 配置 https 集群(十五)
目录 一.背景 1.1 需求 1.2 Ingress 1.3 环境介绍 二.安装部署 2.1.创建后端 Pod 应用 2.2 创建后端 Pod Service 2.3.创建 ingress 资源 2. ...
- 将本机电脑作为自己的网站服务器--基于XAMPP在本地建立wordPress网站
"我不敢说自己从未担心害怕过. 实际上我希望少一点担心害怕,因为它让我分心,让我的神经系统备受煎熬".----马斯克 周日,搞了大半天,为了熟悉wordPress,先在自己的电脑上 ...
- LeetCode 151. 翻转字符串里的单词(Reverse Words in a String)
151. 翻转字符串里的单词 151. Reverse Words in a String
- 总结IDEA和VS常用实用的快捷键
整理了我一般撸码时使用下面两个IDE最常用到的快捷键: IntelliJ IDEA: 快捷搜索:Ctrl+F (Match Case:区分大小写,Words:全字匹配,Regex:正则匹配) 批量替换 ...
- [转帖]微软宣布加入 OpenJDK 项目
微软宣布加入 OpenJDK 项目 https://news.cnblogs.com/n/646003/ 近日,微软的 Bruno Borges 在 OpenJDK 邮件列表中发布了一条消息,内容包含 ...
- Charles手机代理设置
Charles工具 手机 方法/步骤 1.打开Charles 点击Proxy,选择proxy settings,输入端口8888 打开电脑,在cmd中输入ipconfig,查看本地 ...
- flask框架(二)——flask4剑客、flask配置文件的4种方式
之前学习的Django有必备三板斧:render,HttpResponse,redirect,JsonResponse 在flask也有,但是有些不同 一.Flask4剑客 1.直接返回字符串(ret ...