前言楼主目前正在研究jenkins,gitlab-ci,node环境下js脚本的执行。发现环境变量的配置有时会读取失败。同时,在切换角色时,有时su-user和suuser的实际阅读环境配置是不一样的。这里先大致介绍一下,然后进入正题。终端的概念参考了维基百科的介绍。终端是计算机或计算机系统,用于让用户输入数据并显示计算结果。伪终端与虚拟终端伪终端一般情况下,我们使用ssh命令来连接远程服务器。这时会在服务器上建立一个伪终端进程。使用tty返回/dev/pts/n虚拟终端的内容。如果直接在机器上启动终端,则使用tty[1-n]虚拟控制台终端。mac下虚拟控制台终端为/dev/ttys[001-nnn]shell环境latitudeloginshell和no-loginshell交互式shell和非交互式shellloginshell常见的进入loginshell的方式:1.主机进入控制台terminal2.ssh远程登录到伪终端3.su-用户名登录shell进入/etc/profile~/.bash_profile,~/.bash_login,~/.profile(只有一个配置文件会被读取文件,匹配其中一个文件后不会再读取其他文件,读取顺序与显示顺序一致)non-loginshellnon-loginshell,顾名思义就是不通过登录进入的shell环境,比如直接使用/usr/bin/bash、/usr/bin/sh等shell环境。进入非登录shell的几种方法在目前的登录shell案例中,使用bash进入子shell进程,使用XWindow登录Linux,然后以X图形界面启动终端机的非登录shell会读到配置文件~/.bashrc依次进入(通常.bashrc脚本会读作/etc/bashrc)交互式shell在控制台终端或伪终端,shell等待你的输入。并立即执行您提交的命令。这种模式称为交互式,因为shell与用户交互。非交互式shell使用shell来执行脚本文件,或者将输出通过管道传递给shell程序。那么脚本运行的环境属于非交互式shell。Q&A如何判断当前shell是登录shell还是非登录shell?[hostname]$echo$0#return`-bash`[hostname]$/usr/bin/bash#进入非登录shell[hostname]$echo$0#return`bash`echo$0如果是-bash,即第一个符号是-,表示该shell是登录shell。如果没有-开头,则表示未登录shell如何读取登录shell中.bashrc的配置?在.bash_profile中添加如下内容,意思是if[-f~/.bashrc];然后。~/.bashrcfi如何判断当前shell是交互式shell还是非交互式shell?[主机名]$echo$-#返回`himBH`[主机名]$echo'echo$-'|bash#返回`hB`在shell环境下执行echo$-如果返回himBH,则为交互式shell,如果返回hB,则为交互式shell四种组合及案例介绍loginshell&interactiveshellssh远程服务器,等待用户inputshellloginshell&non-interactiveshellsshremoteserver,executescriptnon-loginshell&interactiveshellsshremoteserver,su切换角色,等待用户输入non-loginshell&non-interactiveshellsshremoteserver,su切换角色,执行脚本文件定义方式~/.bash_profileexport定义的环境变量PATH=$PATH:$HOME/.local/bin:$HOME/bin定义在~/.bashrcexportPATH=$PATH:/usr/local/node-v6.9.5/bin在交互式shell,usevariablename=variablevalue(环境变量影响shell)$>ENV=test$>echo$ENV在交互式shell中,usevariablename=variablevalue./scriptfile(只影响执行的shell的环境变量脚本,相当于设置变量而不是环境变量)test.jsconsole.log(process.env.NODE_ENV)交互式shell环境NODE_ENV=testnodetest.js#echotestecho$NODE_ENV#echoempty在交互式shell中,使用export变量名=变量值&&./script文件(影响shell执行的环境变量)test.jsconsole.log(process.env.NODE_ENV)交互式shell环境$>exportNODE_ENV=test&&./test.js#echotest$>echo$NODE_ENV#echotest在执行脚本中,使用导出变量名=变量值,只影响shell脚本中执行的程序的环境变量。test.shexportNODE_ENV='test'node./test.jstest.jsconsole.log(进程.env.NODE_ENV);交互式shell环境./test.sh#echotestecho$NODE_ENV#echoempty常见问题使用sudo命令,$PATH环境变量明明在指定目录下存在,为什么找不到?以node,npm为例,将执行目录/usr/local/node/bin添加到$PATH中,但是sudonpm执行失败。$sudonpminstalllodash#执行失败。$sudoecho$PATH/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/local/php/bin:/usr/local/node/bin$sudowhichnpmwhich:nonpmin(/sbin:/bin:/usr/sbin:/usr/bin)因为sudo指的是为了安全起见,PATH的目录是有限制的。解决办法:修改sudo的secure_path打开sudo的配置文件:sudovisudo使用secure_path命令修改sudoers中默认的PATH为你想要的路径,取消PATH变量的重置。sudo配置文件:sudovisudoChangeDefaultsenv_resettoDefaults!env_resetAddaliassudo='sudoenvPATH=$PATH'in.bash_profileor.bashrc是非常重要的一部分内容。其实不仅仅是上面定义环境变量的方法,在nginx.conf的配置中也可以定义fastcgi_param环境变量传递给php-fpm进程,php-fpm.conf也可以定义环境变量以通过php-fpm进程。如果大家还有相关知识,会继续做一个总结。欢迎大家提问或质疑内容。喜欢的话可以点赞或者收藏哦~~参考文章登录Shell和非登录Shell的区别?如何将环境变量传递给非交互式shell(示例)?
