# shell 和 bash

在计算机科学中,shell 俗称壳(用来区别于核,核是指 “内核”),shell 是指 “提供使用者使用界面” 的软件(命令解析器)。它类似于 DOS 下的 command.com 和后来的 cmd.exe 。它接收用户命令,然后调用相应的应用程序。

在很多并不正式的场合,这两个名词表达的意思相同,即命令解释器。但从严格的意义上讲,命令行是指供用户输入命令的界面,其本身只是接受输入,然后把命令传递给命令解释器,后者就是 shell,从本质上讲,shell 是一个程序,它在用户和操作系统之间提供了一个面向行的可交互接口,用户在命令行中输入命令,运行在后台的 shell 把命令转换成指令代码发送给操作系统。shell 并非只有命令行这一种形式,例如 GNOME、KDE 等图形界面也是 shell,不过它们是 GUI shell,都是为了解决人机交互的问题。

目前在 Linux 环境下有几种不同类型的 shell,常用的有 Bourne Shell(sh)、Bourne Again Shell(bash)、Z Shell(zsh)、C Shell(csh)、tcsh(csh 的扩展)、Korn Shell(ksh)、pdksh(ksh 的扩展)。不同的 Shell 提供不同的语法和特性。

bash 相当于 shell 中的某个,shell 的范围更广。bash 的全称是 Bourne Again Shell。

# 获取当前环境变量

  • echo $varname 命令输出当前指定的环境变量的值

    使用 echo 命令可以输出指定的环境变量的值,例如: echo $PATH ,该命令会输出当前用户的 PATH 环境变量值。如果你想查看其他环境变量,只需要将上述命令中的 PATH 替换为其他环境变量即可。

  • export 命令显示当前系统定义的所有环境变量

  • printenv / env 命令查看所有已定义环境变量或指定的环境变量

    printenvenv 都可以输出所有已定义的环境变量及其对应的值。 printenv 命令也可以单独输出当前指定的环境变量的值,例如: printenv SHELL ,该命令会输出已定义的 SHELL 环境变量值。而 env 命令,可以使用 env | grep VARIABLE_NAME ,查看对应的 VARIABLE_NAME 环境变量值。

note: PATH 变量定义了运行命令的查找路径,以冒号 : 分割不同的路径,使用 export 定义的时候可加双引号也可不加。

# 设置环境变量

# 临时环境变量

# export 命令

export 命令也可用于设置环境变量。

在 shell 中执行程序时,shell 会提供一组环境变量。 export 可新增,修改或删除环境变量,供后续执行的程序使用。 export 的效力仅限于该次登陆操作。

# set 命令

set 命令作用主要是显示系统中已经存在的 shell 变量,以及设置 shell 变量的新变量值。使用 set 更改 shell 特性时,符号 "+" 和 "-" 的作用分别是打开和关闭指定的模式。 set 命令不能够定义新的 shell 变量。

具体可看:https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html

# 永久环境变量

# 系统级

  1. /etc/environment :系统在登录时读取的第一个文件,用于为所有进程设置环境变量。系统使用此文件时并不是执行此文件中的命令,而是根据 KEY=VALUE 模式的代码,对 KEY 赋值以 VALUE ,因此文件中如果要定义 PATH 环境变量,只需加入类似如 PATH=$PATH:/xxx/bin 的代码即可。

  2. /etc/profile :是系统登录时执行的第二个文件,可以用于设定针对全系统所有用户的环境变量,并从 /etc/profile.d 目录的配置文件中搜集 shell 的设置;这个文件,是任何用户登陆操作系统以后都会读取的文件(如果用户的 shell 是 csh 、tcsh 、zsh ,则不会读取此文件)。该文件一般是调用 /etc/bash.bashrc 文件。

  3. /etc/bash.bashrc :系统级的 bashrc 文件,为每一个运行 bash shell 的用户执行此文件。此文件会在用户每次打开 bash shell 时执行一次;因此,如果你想让每个使用 bash 的用户每新开一个 bash 和每次登陆都执行某些操作,或者给他们定义一些新的环境变量,就可以在这个里面设置。

note:

  • 生效时间:使用相同的用户打开新的终端时生效,或者手动更新环境变量生效(见更新环境变量)

  • 生效期限:永久有效

  • 生效范围:所有用户

# 用户级

  1. ~/.profile: 是对应当前登录用户的 profile 文件,用于定制当前用户的个人工作环境。每个用户都可使用该文件输入专用于自己使用的 shell 信息,当用户登录时,该文件仅仅执行一次。默认情况下,会设置一些环境变量,执行用户的 .bashrc 文件。

  2. ~/.bashrc: 是对应当前登录用户的 bash 初始化文件,当用户每次打开 bash shell 时,系统都会执行此文件一次。通常设置环境变量修改这个文件。

note:

  • 生效时间:使用相同的用户打开新的终端时生效,或者手动更新环境变量生效(见更新环境变量)
  • 生效期限:永久有效
  • 生效范围:仅对当前用户有效

总结:

环境变量的分类可以简单的分成用户级别的环境变量以及系统级别的环境变量。

系统级别环境变量定义文件: /etc/bash.bashrc (部分系统为: /etc/bashrc )、 /etc/profile (部分系统为: /etc/bash_profile )、 /etc/environment

用户级别环境变量定义文件: ~/.bashrc~/.profile (部分系统为: ~/.bash_profile

另外在用户环境变量中,系统会首先读取 ~/.profile (或者 ~/.bash_profile )文件,如果没有该文件则读取 ~/.bash_login ,根据这些文件中内容再去读取 ~/.bashrc

环境变量加载顺序:

/etc/enviroment –> /etc/profile –> /etc/bash.bashrc –> ~/.profile –> ~/.bashrc

tips:

一般在 /etc/profile.d/ 目录下创建一个自定义脚本会是修改环境变量的更好方法,这样无论你在一个终端中如何切换用户,环境变量依然存在。eg:

cat > /etc/profile.d/test.sh << EOF
export PATH=$PATH:/home/arachnid/mysql/bin
EOF

# 删除环境变量

如果是临时环境变量,或者是要临时删除一下环境变量,可以使用 unset 命令: unset VARIABLE_NAME ;如果是要永久删除配置文件中的环境变量,需要去相应的配置文件中移除相关的配置项。

# 更新环境变量

eg:更新 /etc/profile 文件的环境变量

source /etc/profile
# or
. /etc/profile

# 常用环境变量

变量内容
DISPLAY如果你正在运行图形界面环境,那么这个变量就是你显示器的名字。通常,它是 “:0”, 意思是由 X 产生的第一个显示器。
EDITOR文本编辑器的名字。
SHELLshell 程序的名字。
HOME用户家目录。
LANG定义了字符集以及语言编码方式。
OLD_PWD先前的工作目录。
PAGER页输出程序的名字。这经常设置为 /usr/bin/less。
PATH由冒号分开的目录列表,当你输入可执行程序名后,会搜索这个目录列表。
PS1Prompt String 1. 这个定义了你的 shell 提示符的内容。随后我们可以看到,这个变量内容可以全面地定制。
PWD当前工作目录。
TERM终端类型名。类 Unix 的系统支持许多终端协议;这个变量设置你的终端仿真器所用的协议。
TZ指定你所在的时区。大多数类 Unix 的系统按照协调时间时 (UTC) 来维护计算机内部的时钟 ,然后应用一个由这个变量指定的偏差来显示本地时间。
USER你的用户名

# 参考

https://wiki.archlinux.org/title/Environment_variables

https://www.cnblogs.com/youyoui/p/10680329.html

http://rvdsd.top/2018/04/28/Linux/Linux 环境变量 /

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

夏沫の浅雨 微信支付

微信支付

夏沫の浅雨 支付宝

支付宝