linux环境变量
bash shell使用环境变量来存储关于shell会话和工作环境的信息。有两种环境变量,全局变量和本地变量。
全局环境变量
全局环境变量在shell会话和该shell产生的任何子进程都可见。本地变量只在创建他们的shell中可见。在产生需要父进程信息的子进程的应用程序中,这便体现了全局变量的重要作用。 系统环境变量始终使用全大写字母来区别普通用户环境变量。
使用 printenv 来查看系统环境变量。
要显示某个环境变量的值,可以使用echo $ 环境变量 。
jason@Ubuntu:~$ echo $HOME
/home/jason
jason@Ubuntu:~$ bash
jason@Ubuntu:~$ echo $HOME
/home/jason
上例中,在当前shell中echo 系统环境变量, 和在该shell产生出的子进程bash 产生出来的shell 中echo环境变量 相同。
本地环境变量
本地环境变量只在定义他们的本地进程中可见。
设置环境变量
1. 设置本地环境变量
启用bash shell(或产生shell 脚本)之后,将能够创建在shell进程中可见的本地变量,可以为环境变量分配一个数值或字符串值。
$ test=testinginging
$echo $test //调用之前要加$
testinginging
如果要指定包含空格的字符串值,则需要使用单引号来指示字符的起始和终止位置。
$test='testing a long word'
$echo test
testing a long word
如果没有单引号,则shell将假定下一个字符是另一个要处理 的命令。
在bash shell中的标准约定,如果要创建新的环境变量,则建议(不要求)使用小写字母。这有助于区别个人环境变量和系统环境变量。
注意:环境变量名称、等号和值之间没有空格。如果添加了空格,则bash shell将值解释为一个单独的命令。
注意本地环境变量只适用于当前进程,在该进程的子进程或者父进程中均不可用。(通过bash shell中开辟bash shell进行测试)
jason@Ubuntu:~$ test='testing a long string'
jason@Ubuntu:~$ echo $test
testing a long string
jason@Ubuntu:~$ bash
jason@Ubuntu:~$ echo $test //子进程中没有显示
2.设置全局环境变量
全局环境变量在设置全局环境变量的进程和由该进程创建的子进程中都可见。创建全局环境变量的方法是创建一个本地环境变量,然后将它导出到全局环境中。export指令完成。
jason@Ubuntu:~$ test='testing a long string'jason@Ubuntu:~$ echo $test
testing a long string
jason@Ubuntu:~$ export test //在导出本地环境变量时,不必使用$
jason@Ubuntu:~$ bash
jason@Ubuntu:~$ echo $test
testing a long string //在子进程中也有效
3、移除环境变量
unset 环境变量名 // 注意环境变量之前不要使用 $ 符号
如果在子进程中使用unset 移除全局环境变量,则操作只是对子进程有效。全局变量在父进程中仍然可用。
重要的环境的变量
PATH 在shell中输入命令时,shell必须搜索系统以找到程序,PATH环境变量定义了它搜索命令的目录。
设置PATH环境变量:
如果希望在PATH变量中添加自己的程序所在的目录(例如 /home/jason/tmp)则可以使用:
PATH=$PATH:/home/jason/tmp
程序员经常使用的一个技巧是在PATH环境变量中包含一个 . 号,表示当前目录,PATH=$PATH:.
这种更改只是临时有效,且只对本进程和子进程有用,其他shell进程中无效。
定位系统环境变量:
通过登陆linux系统启动bash shell时。bash默认将检查一些文件以执行命令,这些文件为启动文件。bash 处理的启动文件依赖于启动bash shell 的方法,可用三种方法来启动bash shell:
(1)在登陆时作为默认登陆shell
登陆到linux系统时,bash shell将作为登陆shell启动,登陆shell将查找4个不同的启动文件来处理其中的命令。bash shell处理的文件顺序如下:
(a) /etc/profile
(b) $HOME/.bash_profile
(c) $HOME/.bash_login
(d) $HOME/.profile
(2)作为非登陆shell的交互式shell
如果启动了一个bash shell而没有登陆系统(比如只是在CLI提示符中输入bash),则使用的为交互式shell。
如果bash作为交互式shell启动,则不会处理 /etc/profile 文件。相反,他会检查用户HOME目录中的 .bashrc文件。
(3)作为非交互式shell运行脚本
shell变量数组(不常用)
$mytest=(one two three four five)
$echo $mytest
one
$echo ${mytest[2]}
three
$echo ${mytest[*]}
one two three four five
$mytest[2]=seven
$echo {mytest[2]}
seven
$unset {mytest[2]}
$echo {mytest[2]}
$unset {mytest[*]}
使用命令别名:
虽然别名本质上不是环境变量,但是他的行为却和环境变量差不多。要察看活动别名的列表,是哦那个带 -p 参数的alias命令
jason@Ubuntu:~$ alias -p
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
可以使用 alias 命令创建自己的别名:
jason@Ubuntu:~$ alias li='ls -il'
jason@Ubuntu:~$ li
总用量 52
1320679 -rw-r--r-- 1 jason jason 8445 11月 30 00:52 examples.desktop
1709457 drwxrwxr-x 3 jason jason 4096 11月 30 15:12 Projects
1319106 -rw-rw-r-- 1 jason jason 0 11月 30 21:48 tty1
1322667 -rw-rw-r-- 1 jason jason 0 11月 30 21:49 tty2
命令别名与本地环境变量的行为相似,他们只对定义范围内的shell进程有效。
在启动新的交互式shell时,bash shell始终会读取 $HOME/.bashrc启动文件。这是放置别名语句的最好位置。