11.3 系統(tǒng)環(huán)境變量與個(gè)人環(huán)境變量的配置文件
上面講了很多系統(tǒng)變量,那么在Linux系統(tǒng)中,這些變量存在哪里呢?為什么用戶一登錄shell就自動(dòng)有了這些變量呢?我們先來(lái)看看下面幾個(gè)文件。
/etc/profile:這個(gè)文件預(yù)設(shè)了幾個(gè)重要的變量,例如PATH、USER、LOGNAME、MAIL、INPUTRC、HOSTNAME、HISTSIZE、umask等。
/etc/bashrc:這個(gè)文件主要預(yù)設(shè)umask以及PS1。這個(gè)PS1就是我們?cè)谳斎朊顣r(shí)前面的那串字符。例如,阿銘的Linux系統(tǒng)的PS1就是[root@localhost~]#,我們不妨看一下PS1的值,如下所示:
?
# echo $PS1 [u@h W]$
?
其中,u指用戶,h指主機(jī)名,W指當(dāng)前目錄,$指字符#(如果是普通用戶,則顯示為$)。
除了以上兩個(gè)系統(tǒng)級(jí)別的配置文件外,每個(gè)用戶的主目錄下還有以下幾個(gè)隱藏文件。
bash_profile:該文件定義了用戶的個(gè)人化路徑與環(huán)境變量的文件名稱。每個(gè)用戶都可使用該文件輸入專屬于自己的shell信息,當(dāng)用戶登錄時(shí),該文件僅僅執(zhí)行一次。
bashrc:該文件包含專屬于自己的shell的bash信息,當(dāng)?shù)卿浕蛎看未蜷_新的shell時(shí),該文件會(huì)被讀取。例如,你可以將用戶自定義的別名或者自定義變量寫到這個(gè)文件中。
bash_history:該文件用于記錄命令歷史。
bash_logout:當(dāng)退出shell時(shí),會(huì)執(zhí)行該文件。你可以將一些清理的工作放到這個(gè)文件中。
11.4 Linux shell中的特殊符號(hào)
在學(xué)習(xí)Linux的過程中,也許你已經(jīng)接觸過某個(gè)特殊符號(hào),例如*,它是一個(gè)通配符,代表零個(gè)或多個(gè)字符或數(shù)字。下面阿銘就介紹一下常用的特殊字符。
11.4.1 *代表零個(gè)或多個(gè)任意字符
這個(gè)字符前面已經(jīng)介紹過,這里再次提到,它的用法如下:
?
#?ls?/tmp/4_6/test* /tmp/4_6/test1 /tmp/4_6/test111 /tmp/4_6/test4 /tmp/4_6/test5
?
11.4.2 ?只代表一個(gè)任意的字符
這個(gè)字符的用法如下:
?
#?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
?
不管是數(shù)字還是字母,只要是一個(gè)字符,都能匹配出來(lái)。
11.4.3 注釋符號(hào)#
這個(gè)符號(hào)在Linux中表示注釋說明,即#后面的內(nèi)容都會(huì)被忽略。用法如下:
?
#?abc=123?#aaaaa #?echo?$abc 123
?
11.4.4 脫義字符
這個(gè)字符會(huì)將后面的特殊符號(hào)(如*)還原為普通字符。用法如下:
?
#?ls?-d?test* ls: cannot access 'test*': No such file or directory
?
11.4.5 再說管道符|
這個(gè)字符前面曾多次出現(xiàn)過,它的作用是將前面命令的輸出作為后面命令的輸入。這里提到的后面的命令,并不是所有的命令都可以的,一般針對(duì)文檔操作的命令比較常用。例如cat、less、head、tail、grep、cut、sort、wc、uniq、tee、tr、split、sed、awk等,其中g(shù)rep、sed和awk是正則表達(dá)式必須掌握的工具,在后面會(huì)詳細(xì)介紹。管道符的用法如下:
?
#?cat?testb.txt?|wc?-l 0
?
在上例中,wc -l用來(lái)計(jì)算一個(gè)文檔有多少行。管道的作用在于將左邊命令的輸出內(nèi)容作為右邊命令的輸入。
11.4.6 特殊符號(hào)$
符號(hào)$可以用作變量前面的標(biāo)識(shí)符,還可以和!結(jié)合起來(lái)使用。示例命令如下:
?
# cd .. # ls testb.txt testb.txt # ls !$ ls testb.txt testb.txt
?
!$表示上條命令中的最后一個(gè)變量,本例中上條命令最后是testb.txt,那么在當(dāng)前命令下輸入!$則代表testb.txt。
11.4.7 特殊符號(hào);
通常,我們都是在一行中輸入一個(gè)命令,然后回車就運(yùn)行了。如果想在一行中運(yùn)行兩個(gè)或兩個(gè)以上的命令,需要在命令之間加符號(hào);。示例命令如下:
?
# mkdir testdir ; touch test1.txt ; touch test2.txt; ls -d test* test1.txt test2.txt testb.txt testdir
?
11.4.8 特殊符號(hào)~
符號(hào)~表示用戶的家目錄,root用戶的家目錄是/root ,普通用戶則是/home/username。示例命令如下:
?
#?cd?~ #?pwd /root #?su?aming $?cd?~ $?pwd /home/aming
?
11.4.9 特殊符號(hào)&
如果想把一條命令放到后臺(tái)執(zhí)行,則需要加上符號(hào)&,它通常用于命令運(yùn)行時(shí)間較長(zhǎng)的情況。比如,可以用在sleep后,如下所示:
?
#?sleep?30?& [1] 3808 #?jobs [1]+ 運(yùn)行中 sleep 30 &
?
11.4.10 重定向符號(hào)>、>>、2>和2>>
前面講過重定向符號(hào)>和>>,它們分別表示取代和追加的意思。當(dāng)我們運(yùn)行一個(gè)命令報(bào)錯(cuò)時(shí),報(bào)錯(cuò)信息會(huì)輸出到當(dāng)前屏幕。如果想重定向到一個(gè)文本,則要用重定向符號(hào)2>或者2>>,它們分別表示錯(cuò)誤重定向和錯(cuò)誤追加重定向。示例命令如下:
?
#?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 中括號(hào)[]
中括號(hào)內(nèi)為字符組合,代表字符組合中的任意一個(gè),可以是一個(gè)范圍(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 特殊符號(hào)&&和||
前面提到了分號(hào)可作為多條命令間的分隔符,其實(shí)還有兩個(gè)可以用于多條命令中間的特殊符號(hào),那就是&&和||。下面阿銘列出以下幾種情況:
command1 ; command2
command1 && command2
command1 || command2
使用;時(shí),不管command1是否執(zhí)行成功,都會(huì)執(zhí)行command2。
使用&&時(shí),只有command1執(zhí)行成功后,command2才會(huì)執(zhí)行,否則command2不執(zhí)行。
使用||時(shí),command1執(zhí)行成功后則command2不執(zhí)行,否則執(zhí)行command2,即command1和command2中總有一條命令會(huì)執(zhí)行。接下來(lái),阿銘要通過做試驗(yàn)來(lái)說明&&與||這兩個(gè)特殊符號(hào)的作用:
?
#?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
?
本例中,只有當(dāng)ls test2成功執(zhí)行后,才會(huì)執(zhí)行touch test2。因?yàn)閠est2不存在, ls test2沒有執(zhí)行成功,所以&&后面的touch test2并沒有執(zhí)行。
?
#?ls?test2?||?touch?test2 ls: cannot access 'test2': No such file or directory #?ls?test* test1 test2 test3
?
本例中,若ls test2執(zhí)行不成功,則會(huì)執(zhí)行touch test2。因?yàn)閠est2不存在,所以ls test2沒有執(zhí)行成功,轉(zhuǎn)而執(zhí)行||后面的touch test2,所以增加了test2這個(gè)文件。
審核編輯:湯梓紅
評(píng)論
查看更多