楼主最近在研究 jenkins ,gitlab-ci, 以及 node 环境下 js 脚本执行. 发现环境变量的配置有时候读取失败. 同时在切换角色的时候, 如 su - user 和 su user 实际上的读取环境配置是不一样的. 大致介绍这里, 接下来进入正题。
引用 wiki 百科的介绍
终端是一台电脑或者计算机系统,用来让用户输入数据,及显示其计算结果的机器
一般情况下, 我们采用 ssh 命令去连接远程服务器. 此时在服务器会建立一个伪终端进程. 使用 tty 返回 /dev/pts/n 内容
如果直接在机器上启动终端, 那么则使用的是 tty[1-n] 虚拟控制台终端. mac 下的虚拟控制台终端为 /dev/ttys[001-nnn]
- non-interactive shell
常见的进入 login shell 的几种方式:
- . 主机进入控制台终端
- . ssh远程登录进入伪终端
- . su - 用户名
login shell 进入后会依次读取以下几类配置文件
non-login shell, 顾名思义, 不是通过登录的方式进入的 shell 环境, 如直接使用 / usr/bin/bash , /usr/bin/sh 之类进入的 shell 环境.
进入 non-login shell 的几种方式
non-login shell 进入后会依次读取配置文件~/.bashrc (通常. bashrc 脚本内又会读取 /etc/bashrc)
在控制台终端或者伪终端里,shell 等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为 shell 与用户进行交互.
- non-interactive shell
使用 shell 执行脚本文件, 或者通过管道的形式将输出转向 shell 程序。 那么脚本运行的环境属于非交互性 shell.
- [主机名]$ echo $0 # 返回 `-bash`
- [主机名]$ /usr/bin/bash # 进入non-login shell
- [主机名]$ echo $0 # 返回 `bash`
echo $0 如果为 -bash , 即第一个符号为 -, 则表示该 shell 为 login shell. 如果开头没有 - 则代表为 non-login shell
如何在 login shell 也能读取到. bashrc 的配置?在 .bash_profile 加入下面这段内容, 表示每次进入后都会运行
如何判断当前 shell 为 interactive shell 还是
- if [ -f ~/.bashrc ]; then
- . ~/.bashrc
- fi
?
- non-interactive shell
- [主机名]$ echo $- # 返回 `himBH`
- [主机名]$ echo 'echo $-' | bash # 返回 `hB`
在 shell 环境下执行 echo $-, 如果返回的为 himBH 则为 interactive shell, 如果返回的为 hB, 则为 interactive shell
四种组合情况及案例介绍
- non-interactive shell
- non-interactive shell
定义在 ~/.bashrc
- export PATH = $PATH: $HOME / .local / bin: $HOME / bin
在交互型 shell, 使用 变量名 = 变量值 (影响该 shell 的环境变量)
- export PATH = $PATH: /usr/local / node - v6.9.5 / bin
在交互型 shell, 使用 变量名 = 变量值 ./ 脚本文件 (只影响执行脚本 shell 的环境变量, 相当于设置变量而非环境变量)
- $ > ENV=test
- $ > echo $ENV
test.js
- console.log(process.env.NODE_ENV)
交互型 shell 环境
在交互型 shell, 使用 export 变量名 = 变量值 && ./ 脚本文件 (影响执行 shell 的环境变量)
- NODE_ENV=test node test.js # echo test
- echo $NODE_ENV # echo empty
test.js
- console.log(process.env.NODE_ENV)
交互型 shell 环境
在执行脚本内, 使用 export 变量名 = 变量值, 只影响 shell 脚本内执行的程序的环境变量.
- $ > export NODE_ENV=test && ./test.js # echo test
- $ > echo $NODE_ENV # echo test
test.sh
- export NODE_ENV='test'
- node ./test.js
test.js
- console.log(process.env.NODE_ENV);
交互型 shell 环境
- ./test.sh # echo test
- echo $NODE_ENV # echo empty
拿 node, npm 为例, 执行目录 / usr/local/node/bin 加入了 $PATH 中,sudo npm 执行却失败了
- $ sudo npm install lodash # 执行失败
- $ sudo echo $PATH
- /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/local/php/bin:/usr/local/node/bin
- $ sudo which npm
- which: no npm in (/sbin:/bin:/usr/sbin:/usr/bin)
原因在于 sudo 指令为了安全起见,限制了 PATH 的目录, 解决办法:
- alias sudo='sudo env PATH=$PATH'
因为经常和服务器打交道, 时常会使用一些脚本, 而环境变量则是其中非常重要的一节内容.
其实不止以上这些定义环境变量的方式, 在 nginx.conf 的配置中也可以定义 fastcgi_param 环境变量传递给 php-fpm 进程, php-fpm.conf 也可以定义环境变量传递给 php-fpm 进程. 如果还有相关的知识, 也会继续做总结.
欢迎大家提问或质疑其中内容, 喜欢的话可以点赞或收藏~~
来源: https://segmentfault.com/a/1190000012653386