在Linux系统中系统变量存在哪里呢?

描述

11.3 系统环境变量与个人环境变量的配置文件

上面讲了很多系统变量,那么在Linux系统中,这些变量存在哪里呢?为什么用户一登录shell就自动有了这些变量呢?我们先来看看下面几个文件。

/etc/profile:这个文件预设了几个重要的变量,例如PATH、USER、LOGNAME、MAIL、INPUTRC、HOSTNAME、HISTSIZE、umask等。

/etc/bashrc:这个文件主要预设umask以及PS1。这个PS1就是我们在输入命令时前面的那串字符。例如,阿铭的Linux系统的PS1就是[root@localhost~]#,我们不妨看一下PS1的值,如下所示:

 

# echo $PS1
[u@h W]$

 

其中,u指用户,h指主机名,W指当前目录,$指字符#(如果是普通用户,则显示为$)。

除了以上两个系统级别的配置文件外,每个用户的主目录下还有以下几个隐藏文件。

bash_profile:该文件定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专属于自己的shell信息,当用户登录时,该文件仅仅执行一次。

bashrc:该文件包含专属于自己的shell的bash信息,当登录或每次打开新的shell时,该文件会被读取。例如,你可以将用户自定义的别名或者自定义变量写到这个文件中。

bash_history:该文件用于记录命令历史。

bash_logout:当退出shell时,会执行该文件。你可以将一些清理的工作放到这个文件中。

11.4 Linux shell中的特殊符号

在学习Linux的过程中,也许你已经接触过某个特殊符号,例如*,它是一个通配符,代表零个或多个字符或数字。下面阿铭就介绍一下常用的特殊字符。

11.4.1 *代表零个或多个任意字符

这个字符前面已经介绍过,这里再次提到,它的用法如下:

 

# ls /tmp/4_6/test*
/tmp/4_6/test1 /tmp/4_6/test111  /tmp/4_6/test4  /tmp/4_6/test5

 

11.4.2 ?只代表一个任意的字符

这个字符的用法如下:

 

# touch /tmp/4_6/testa
# ls -d /tmp/4_6/test?
/tmp/4_6/test1 /tmp/4_6/test4  /tmp/4_6/test5 /tmp/4_6/testa

 

不管是数字还是字母,只要是一个字符,都能匹配出来。

11.4.3 注释符号#

这个符号在Linux中表示注释说明,即#后面的内容都会被忽略。用法如下:

 

# abc=123 #aaaaa
# echo $abc
123

 

11.4.4 脱义字符

这个字符会将后面的特殊符号(如*)还原为普通字符。用法如下:

 

# ls -d test*
ls:
cannot access 'test*': No such file or directory

 

11.4.5 再说管道符|

这个字符前面曾多次出现过,它的作用是将前面命令的输出作为后面命令的输入。这里提到的后面的命令,并不是所有的命令都可以的,一般针对文档操作的命令比较常用。

例如cat、less、head、tail、grep、cut、sort、wc、uniq、tee、tr、split、sed、awk等,其中grep、sed和awk是正则表达式必须掌握的工具,在后面会详细介绍。管道符的用法如下:

 

# cat testb.txt |wc -l
0

 

在上例中,wc -l用来计算一个文档有多少行。管道的作用在于将左边命令的输出内容作为右边命令的输入。

11.4.6 特殊符号$

符号$可以用作变量前面的标识符,还可以和!结合起来使用。示例命令如下:

 

# cd ..
# ls testb.txt
testb.txt
# ls !$
ls testb.txt
testb.txt

 

!$表示上条命令中的最后一个变量,本例中上条命令最后是testb.txt,那么在当前命令下输入!$则代表testb.txt。

11.4.7 特殊符号;

通常,我们都是在一行中输入一个命令,然后回车就运行了。如果想在一行中运行两个或两个以上的命令,需要在命令之间加符号;。示例命令如下:

 

# mkdir testdir ; touch
test1.txt ; touch test2.txt; ls -d test*
test1.txt test2.txt 
testb.txt  testdir

 

11.4.8 特殊符号~

符号~表示用户的家目录,root用户的家目录是/root ,普通用户则是/home/username。示例命令如下:

 

# cd ~
# pwd
/root
# su aming
$ cd ~
$ pwd
/home/aming

 

11.4.9 特殊符号&

如果想把一条命令放到后台执行,则需要加上符号&,它通常用于命令运行时间较长的情况。比如,可以用在sleep后,如下所示:

 

# sleep 30 &
[1]
3808
# jobs
[1]+ 运行中               sleep 30 &

 

11.4.10 重定向符号>、>>、2>和2>>

前面讲过重定向符号>和>>,它们分别表示取代和追加的意思。当我们运行一个命令报错时,报错信息会输出到当前屏幕。

如果想重定向到一个文本,则要用重定向符号2>或者2>>,它们分别表示错误重定向和错误追加重定向。示例命令如下:

 

# ls aaaa
ls:
cannot access 'aaaa': No such file or directory
# ls aaaa 2> /tmp/error
# cat /tmp/error
ls:
cannot access 'aaaa': No such file or directory
# ls aaaa 2>> /tmp/error
# cat /tmp/error
ls:
cannot access 'aaaa': No such file or directory
ls:
cannot access 'aaaa': No such file or directory

 

11.4.11 中括号[]

中括号内为字符组合,代表字符组合中的任意一个,可以是一个范围(1-3,a-z),用法如下:

 

# cd /tmp/10
# ls -d test*
test1.txt test2.txt 
testb.txt  testdir
# ls -d test[1-3].txt
test1.txt test2.txt
# ls -d test[12b].txt
test1.txt test2.txt 
testb.txt
# ls -d test[1-9].txt
test1.txt test2.txt
# ls -d test[1-9a-z].txt
test1.txt test2.txt 
testb.txt

 

11.4.12 特殊符号&&和||

前面提到了分号可作为多条命令间的分隔符,其实还有两个可以用于多条命令中间的特殊符号,那就是&&和||。下面阿铭列出以下几种情况:

command1 ; command2

command1 && command2

command1 || command2

使用;时,不管command1是否执行成功,都会执行command2。

使用&&时,只有command1执行成功后,command2才会执行,否则command2不执行。

使用||时,command1执行成功后则command2不执行,否则执行command2,即command1和command2中总有一条命令会执行。接下来,阿铭要通过做试验来说明&&与||这两个特殊符号的作用:

 

# rm -rf test*
# touch test1 test3
# ls test2 && touch test2
ls:
cannot access 'test2': No such file or directory
# ls test2
ls:
cannot access 'test2': No such file or directory

 

本例中,只有当ls test2成功执行后,才会执行touch test2。因为test2不存在, ls test2没有执行成功,所以&&后面的touch test2并没有执行。

 

# ls test2 || touch test2
ls:
cannot access 'test2': No such file or directory
# ls test*
test1 test2 
test3

 

本例中,若ls test2执行不成功,则会执行touch test2。因为test2不存在,所以ls test2没有执行成功,转而执行||后面的touch test2,所以增加了test2这个文件。







审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分