企業(yè)網(wǎng)站建設(shè)網(wǎng)頁推廣軟文300字
1、命令行?
?1) 重要快捷鍵
按鍵 | 作用 |
---|---|
Tab | 命令補全 |
Ctrl+ | 強行終止當(dāng)前程序 |
Ctrl+d | 鍵盤輸入結(jié)束或退出終端 |
Ctrl+s | 暫停當(dāng)前程序,暫停后按下任意鍵恢復(fù)運行 |
Ctrl+z | 將當(dāng)前程序放到后臺運行,恢復(fù)到前臺為命令fg |
Ctrl+a | 將光標(biāo)移至輸入行頭,相當(dāng)于Home 鍵 |
Ctrl+e | 將光標(biāo)移至輸入行末,相當(dāng)于End 鍵 |
Ctrl+k | 刪除從光標(biāo)所在位置到行末 |
Alt+Backspace | 向前刪除一個單詞 |
Shift+PgUp | 將終端顯示向上滾動 |
Shift+PgDn | 將終端顯示向下滾動 |
2) 學(xué)會使用通配符
通配符是一種特殊語句,主要有星號(*)和問號(?),用來對字符串進行模糊匹配(比如文件名、參數(shù)名)。當(dāng)查找文件夾時,可以使用它來代替一個或多個真正字符;當(dāng)不知道真正字符或者懶得輸入完整名字時,常常使用通配符代替一個或多個真正字符。
終端里面輸入的通配符是由 Shell 處理的,不是由所涉及的命令語句處理的,它只會出現(xiàn)在命令的“參數(shù)值”里(它不能出現(xiàn)在命令名稱里, 命令不記得,那就用Tab
補全)。當(dāng) Shell 在“參數(shù)值”中遇到了通配符時,Shell 會將其當(dāng)作路徑或文件名在磁盤上搜尋可能的匹配:若符合要求的匹配存在,則進行代換(路徑擴展);否則就將該通配符作為一個普通字符傳遞給“命令”,然后再由命令進行處理??傊?#xff0c;通配符實際上就是一種 Shell 實現(xiàn)的路徑擴展功能。在通配符被處理后, Shell 會先完成該命令的重組,然后繼續(xù)處理重組后的命令,直至執(zhí)行該命令。
cd /home/shiyanlou
touch asd.txt fgh.txt
ls *.txt
在創(chuàng)建文件的時候,如果需要一次性創(chuàng)建多個文件,比如:“l(fā)ove_1_linux.txt,love_2_linux.txt,... love_10_linux.txt”。在 Linux 中十分方便:
touch love_{1..10}_shiyanlou.txt
Shell 常用通配符:
字符 | 含義 |
---|---|
* | 匹配 0 或多個字符 |
? | 匹配任意一個字符 |
[list] | 匹配 list 中的任意單一字符 |
[^list] | 匹配 除 list 中的任意單一字符以外的字符 |
[c1-c2] | 匹配 c1-c2 中的任意單一字符 如:[0-9][a-z] |
{string1,string2,...} | 匹配 string1 或 string2 (或更多)其一字符串 |
{c1..c2} | 匹配 c1-c2 中全部字符 如{1..10} |
3)常識?
用戶可以通過執(zhí)行man
命令調(diào)用手冊頁?
man <command_name>
比如查看 man 命令本身的使用方式?
man man
通常 man 手冊中的內(nèi)容很多,你可能不太容易找到你想要的結(jié)果,不過幸運的是你可以在 man 中使用搜索/<你要搜索的關(guān)鍵字>
,查找完畢后你可以使用n
鍵切換到下一個關(guān)鍵字所在處,shift+n
為上一個關(guān)鍵字所在處。使用Space
(空格鍵)翻頁,Enter
(回車鍵)向下滾動一行,或者使用k
,j
(vim 編輯器的移動鍵)進行向前向后滾動一行。按下h
鍵為顯示使用幫助(因為 man 使用 less 作為閱讀器,實為less
工具的幫助),按下q
退出。
想要獲得更詳細(xì)的幫助,你還可以使用info
命令,不過通常使用man
就足夠了。如果你知道某個命令的作用,只是想快速查看一些它的某個具體參數(shù)的作用,那么你可以使用--help
參數(shù),大部分命令都會帶有這個參數(shù),如:
ls --help
2、用戶及文件權(quán)限管理
用戶管理
2.1查看用戶
who am i
# 或者
who mom likes
# 或者
who -m
# 要查看當(dāng)前登錄用戶的用戶名,去掉空格直接使用
whoami
who
?命令其它常用參數(shù)
參數(shù) | 說明 |
---|---|
-a | 打印能打印的全部 |
-d | 打印死掉的進程 |
-m | 同am i ,mom likes |
-q | 打印當(dāng)前登錄用戶數(shù)及用戶名 |
-u | 打印當(dāng)前登錄用戶登錄信息 |
-r | 打印運行等級 |
2.2創(chuàng)建用戶
su <user>
?可以切換到用戶 user,執(zhí)行時需要輸入目標(biāo)用戶的密碼,sudo <cmd>
?可以以特權(quán)級別運行 cmd 命令,需要當(dāng)前用戶屬于 sudo 組,且需要輸入當(dāng)前用戶的密碼。su - <user>
?命令也是切換用戶,但是同時用戶的環(huán)境變量和工作目錄也會跟著改變成目標(biāo)用戶所對應(yīng)的。?
sudo adduser <用戶名>
sudo adduser liwei
?這個命令不但可以添加用戶到系統(tǒng),同時也會默認(rèn)為新用戶在 /home 目錄下創(chuàng)建一個工作目錄:
ls /home
現(xiàn)在你已經(jīng)創(chuàng)建好一個用戶,并且你可以使用你創(chuàng)建的用戶登錄了,使用如下命令切換登錄用戶:
su -l liwei
?退出當(dāng)前用戶跟退出終端一樣,可以使用?exit
?命令或者使用快捷鍵?Ctrl+D
。
?2.3 用戶組
?在 Linux 里面如何知道自己屬于哪些用戶組呢?
方法一:使用 groups 命令
groups shiyanlou
?其中冒號之前表示用戶,后面表示該用戶所屬的用戶組。這里可以看到 shiyanlou 用戶屬于 shiyanlou 用戶組,每次新建用戶如果不指定用戶組的話,默認(rèn)會自動創(chuàng)建一個與用戶名相同的用戶組(差不多就相當(dāng)于家長的意思)。
默認(rèn)情況下在 sudo 用戶組里的可以使用 sudo 命令獲得 root 權(quán)限。shiyanlou 用戶也可以使用 sudo 命令,為什么這里沒有顯示在 sudo 用戶組里呢?可以查看下?/etc/sudoers.d/shiyanlou
?文件,我們在?/etc/sudoers.d
?目錄下創(chuàng)建了這個文件,從而給 shiyanlou 用戶賦予了 sudo 權(quán)限:
sudo cat /etc/sudoers.d/shiyanlou
?方法二:查看?/etc/group
?文件
cat /etc/group | sort
這里?cat
?命令用于讀取指定文件的內(nèi)容并打印到終端輸出。?| sort
?表示將讀取的文本進行一個字典排序再輸出,然后你將看到如下一堆輸出。
使用?grep
?命令過濾掉掉不需要的結(jié)果:
cat /etc/group | grep -E "shiyanlou"?
?
/etc/group
?文件格式說明
/etc/group 的內(nèi)容包括用戶組(Group)、用戶組口令、GID(組 ID) 及該用戶組所包含的用戶(User),每個用戶組一條記錄。格式如下:
group_name:password:GID:user_list
這里需要注意,如果用戶的 GID 等于用戶組的 GID,那么最后一個字段?user_list
?就是空的,這里的 GID 是指用戶默認(rèn)所在組的 GID,可以使用?id
?命令查看。比如 shiyanlou 用戶,在?/etc/group
?中的 shiyanlou 用戶組后面是不會顯示的。
將其它用戶加入 sudo 用戶組
默認(rèn)情況下新創(chuàng)建的用戶是不具有 root 權(quán)限的,也不在 sudo 用戶組,可以讓其加入 sudo 用戶組從而獲取 root 權(quán)限:
# 注意 Linux 上輸入密碼是不會顯示的
su -l lilei
sudo ls
?會提示 lilei 不在 sudoers 文件中,意思就是 lilei 不在 sudo 用戶組中。
使用?usermod
?命令可以為用戶添加用戶組,同樣使用該命令你必需有 root 權(quán)限,你可以直接使用 root 用戶為其它用戶添加用戶組,或者用其它已經(jīng)在 sudo 用戶組的用戶使用 sudo 命令獲取權(quán)限來執(zhí)行該命令。
這里我用 shiyanlou 用戶執(zhí)行 sudo 命令將 lilei 添加到 sudo 用戶組,讓它也可以使用 sudo 命令獲得 root 權(quán)限,首先我們切換回 shiyanlou 用戶。
su - shiyanlou
此處需要輸入 shiyanlou 用戶密碼。
當(dāng)然也可以通過?sudo passwd shiyanlou
?進行設(shè)置,或者你直接關(guān)閉當(dāng)前終端打開一個新的終端。
groups lilei
sudo usermod -G sudo lilei
groups lilei
?2.4 刪除用戶和用戶組
sudo deluser lilei --remove-home
使用?--remove-home
?參數(shù)在刪除用戶時候會一并將該用戶的工作目錄一并刪除。如果不使用那么系統(tǒng)會自動在 /home 目錄為該用戶保留工作目錄。
Linux 文件權(quán)限
2.1 查看文件權(quán)限?
使用較長格式列出文件:
ls -l
- 文件類型
- 設(shè)備文件(?
/dev
?目錄下有各種設(shè)備文件,大都跟具體的硬件設(shè)備相關(guān))。?socket
:網(wǎng)絡(luò)套接字。pipe
?管道軟鏈接文件
:鏈接文件是分為兩種的,另一種當(dāng)然是“硬鏈接”(硬鏈接不常用,而軟鏈接等同于 Windows 上的快捷方式)。
- 文件權(quán)限
- 讀權(quán)限,表示可以使用?
cat <file name>
?之類的命令來讀取某個文件的內(nèi)容;- 寫權(quán)限,表示你可以編輯和修改某個文件的內(nèi)容;
- 執(zhí)行權(quán)限,通常指可以運行的二進制程序文件或者腳本文件,如同 Windows 上的?
exe
?后綴的文件,不過 Linux 上不是通過文件后綴名來區(qū)分文件的類型- 所屬用戶組權(quán)限,是指你所在的用戶組中的所有其它用戶對于該文件的權(quán)限。
?ls
?命令的一些其它常用的用法:
- 顯示除了?
.
(當(dāng)前目錄)和?..
(上一級目錄)之外的所有文件,包括隱藏文件(Linux 下以?.
?開頭的文件為隱藏文件)。
ls -a
?同時使用?-a
?和?-l
?參數(shù):
ls -al
查看某一個目錄的完整屬性,而不是顯示目錄里面的文件屬性:
ls -dl <目錄名>
- 顯示所有文件大小:
ls -asSh
?其中小 s 為顯示文件大小,大 S 為按文件大小排序,若需要知道如何按其它方式排序,可以使用?man ls
?命令查詢。
2.2 變更文件所有者
su - lilei
-pwd-
touch iphone11
ls -alh iphone11
?ctrl+d??切換回到 shiyanlou 用戶,使用以下命令變更文件所有者為 shiyanlou
# 需要切換到 shiyanlou 用戶執(zhí)行以下操作
cd /home/lilei
ls iphone11
sudo chown shiyanlou iphone11
2.3 修改文件權(quán)限?
文件的權(quán)限有兩種表示方式:
- 方式一:二進制數(shù)字表示
每個文件有三組固定的權(quán)限,分別對應(yīng)擁有者,所屬用戶組,其他用戶,記住這個順序是固定的。文件的讀寫執(zhí)行對應(yīng)字母?rwx
,以二
chmod go-rw iphone11
進制表示就是?111
,用十進制表示就是?7
。例如我們剛剛新建的文件 iphone11 的權(quán)限是?rw-rw-rw-
,換成對應(yīng)的十進制表示就是 666,這就表示這個文件的擁有者,所屬用戶組和其他用戶具有讀寫權(quán)限,不具有執(zhí)行權(quán)限。
如果我要將文件?iphone11
?的權(quán)限改為只有我自己可以用那么就可以用這個方法更改它的權(quán)限。
chmod 600 <文件名>
- 方式二:加減賦值操作
chmod go-rw iphone11
g
、o
?還有?u
?分別表示 group(用戶組)、others(其他用戶) 和 user(用戶),+
?和?-
?分別表示增加和去掉相應(yīng)的權(quán)限。
adduser
?和?useradd
?的區(qū)別是什么答:
useradd
?只創(chuàng)建用戶,不會創(chuàng)建用戶密碼和工作目錄,創(chuàng)建完了需要使用?passwd <username>
?去設(shè)置新用戶的密碼。adduser
?在創(chuàng)建用戶的同時,會創(chuàng)建工作目錄和密碼(提示你設(shè)置),做這一系列的操作。其實?useradd
、userdel
?這類操作更像是一種命令,執(zhí)行完了就返回。而?adduser
?更像是一種程序,需要你輸入、確定等一系列操作。
3、Linux 目錄結(jié)構(gòu)及文件基本操作?
1. FHS 標(biāo)準(zhǔn)
FHS(英文:Filesystem Hierarchy Standard 中文:文件系統(tǒng)層次結(jié)構(gòu)標(biāo)準(zhǔn)),多數(shù) Linux 版本采用這種文件組織形式,FHS 定義了系統(tǒng)中每個區(qū)域的用途、所需要的最小構(gòu)成的文件和目錄同時還給出了例外處理與矛盾處理。
FHS 定義了兩層規(guī)范,第一層是,?/
?下面的各個目錄應(yīng)該要放什么文件數(shù)據(jù),例如?/etc
?應(yīng)該放置設(shè)置文件,/bin
?與?/sbin
?則應(yīng)該放置可執(zhí)行文件等等。
第二層則是針對?/usr
?及?/var
?這兩個目錄的子目錄來定義。例如?/var/log
?放置系統(tǒng)日志文件,/usr/share
?放置共享數(shù)據(jù)等等。
查看目錄結(jié)構(gòu)
tree /
如果提示" command not found ",就先安裝:
sudo apt-get updatesudo apt-get install tree
目錄定義為四種交互作用的形態(tài),如下表所示:?
2. 目錄路徑
使用?cd
?命令可以切換目錄,在 Linux 里面使用?.
?表示當(dāng)前目錄,..
?表示上一級目錄(注意,以?.
?開頭的文件都是隱藏文件,所以這兩個目錄必然也是隱藏的,可以使用?ls -a
?命令查看隱藏文件),-
?表示上一次所在目錄,~
?通常表示當(dāng)前用戶的?home
?目錄。使用?pwd
?命令可以獲取當(dāng)前所在路徑(絕對路徑)。
進入上一級目錄:
cd ..
進入你的?home
?目錄:
cd ~
# 或者 cd /home/<你的用戶名>
使用?pwd
?獲取當(dāng)前路徑:
pwd
絕對路徑
簡單地說就是以根" / "目錄為起點的完整路徑,以你所要到的目錄為終點,表現(xiàn)形式如:?/usr/local/bin
,表示根目錄下的?usr
?目錄中的?local
?目錄中的?bin
?目錄。
相對路徑
相對路徑,也就是相對于你當(dāng)前的目錄的路徑,相對路徑是以當(dāng)前目錄?.
?為起點,以你所要到的目錄為終點,表現(xiàn)形式如:?usr/local/bin
?(這里假設(shè)你當(dāng)前目錄為根目錄)。你可能注意到,我們表示相對路徑實際并沒有加上表示當(dāng)前目錄的那個?.
?,而是直接以目錄名開頭,因為這個?usr
?目錄為?/
?目錄下的子目錄,是可以省略這個?.
?的(以后會講到一個類似不能省略的情況);如果是當(dāng)前目錄的上一級目錄,則需要使用?..
?,比如你當(dāng)前目錄為?/home/shiyanlou
?目錄下,根目錄就應(yīng)該表示為?../../
?,表示上一級目錄(?home
?目錄)的上一級目錄(?/
?目錄)。
下面我們以你的?home
?目錄為起點,分別以絕對路徑和相對路徑的方式進入?/usr/local/bin
?目錄:
# 絕對路徑
cd /usr/local/bin
# 相對路徑
cd ../../usr/local/bin
3、Linux 文件的基本操作
3.1新建
新建空白文件
使用?touch
?命令創(chuàng)建空白文件,關(guān)于?touch
?命令,其主要作用是來更改已有文件的時間戳的(比如,最近訪問時間,最近修改時間),但其在不加任何參數(shù)的情況下,只指定一個文件名,則可以創(chuàng)建一個指定文件名的空白文件(不會覆蓋已有同名文件),當(dāng)然你也可以同時指定該文件的時間戳,更多關(guān)于?touch
?命令的用法,會在下一講文件搜索中涉及。
創(chuàng)建名為 test 的空白文件:
touch test
新建目錄
使用?mkdir
(make directories)命令可以創(chuàng)建一個空目錄,也可同時指定創(chuàng)建目錄的權(quán)限屬性。
創(chuàng)建名為“ mydir ”的空目錄:
mkdir mydir
使用?-p
?參數(shù),同時創(chuàng)建父目錄(如果不存在該父目錄),如下我們同時創(chuàng)建一個多級目錄(這在安裝軟件、配置安裝路徑時非常有用):
mkdir -p father/son/grandson
這里使用的路徑是相對路徑,代表在當(dāng)前目錄下生成,當(dāng)然我們直接以絕對路徑的方式表示也是可以的。
若當(dāng)前目錄已經(jīng)創(chuàng)建了一個 test 文件,再使用?mkdir test
?新建同名的文件夾,系統(tǒng)會報錯文件已存在。
3.2?復(fù)制
復(fù)制文件
使用?cp
?命令(copy)復(fù)制一個文件到指定目錄。
將之前創(chuàng)建的?test
?文件復(fù)制到?/home/shiyanlou/father/son/grandson
?目錄中:
cp test father/son/grandson
復(fù)制目錄?
如果直接使用?cp
?命令復(fù)制一個目錄的話,會出現(xiàn)錯誤
要成功復(fù)制目錄需要加上?-r
?或者?-R
?參數(shù),表示遞歸復(fù)制:
cd /home/shiyanlou
mkdir family
cp -r father family
3.3?刪除
刪除文件
使用?rm
(remove files or directories)命令刪除一個文件:
rm test
有時候你會遇到想要刪除一些為只讀權(quán)限的文件,直接使用?rm
?刪除會顯示一個提示,如下:
你如果想忽略這提示,直接刪除文件,可以使用?-f
?參數(shù)強制刪除:
rm -f test
刪除目錄
跟復(fù)制目錄一樣,要刪除一個目錄,也需要加上?-r
?或?-R
?參數(shù):
rm -r family
遇到權(quán)限不足刪除不了的目錄也可以和刪除文件一樣加上?-f
?參數(shù):
rm -rf family
3.4?移動文件與文件重命名
移動文件
使用?mv
(move or rename files)命令移動文件(剪切)。命令格式是?mv 源目錄文件 目的目錄
。
例如將文件“ file1 ”移動到?Documents
?目錄:
mkdir Documents
touch file1
mv file1 Documents
重命名文件
mv
?命令除了能移動文件外,還能給文件重命名。命令格式為?mv 舊的文件名 新的文件名
。
例如將文件“ file1 ”重命名為“ myfile ”:
mv file1 myfile
批量重命名
要實現(xiàn)批量重命名,可以使用?rename
?來實現(xiàn)。不過它要用 perl 正則表達式來作為參數(shù)。
rename
?命令并不是內(nèi)置命令,若提示無該命令可以使用?sudo apt-get install rename
?命令自行安裝。
cd /home/shiyanlou/# 使用通配符批量創(chuàng)建 5 個文件:
touch file{1..5}.txt# 批量將這 5 個后綴為 .txt 的文本文件重命名為以 .c 為后綴的文件:
rename 's/\.txt/\.c/' *.txt# 批量將這 5 個文件,文件名和后綴改為大寫:
rename 'y/a-z/A-Z/' *.c
rename
?是先使用第二個參數(shù)的通配符匹配所有后綴為?.txt
?的文件,然后使用第一個參數(shù)提供的正則表達式將匹配的這些文件的?.txt
?后綴替換為?.c
。
3.5?查看文件
使用?cat
,tac
?和?nl
?命令查看文件
前兩個命令都是用來打印文件內(nèi)容到標(biāo)準(zhǔn)輸出(終端),其中?cat
?為正序顯示,tac
?為倒序顯示。
標(biāo)準(zhǔn)輸入輸出:當(dāng)我們執(zhí)行一個 shell 命令行時通常會自動打開三個標(biāo)準(zhǔn)文件,即標(biāo)準(zhǔn)輸入文件(stdin),默認(rèn)對應(yīng)終端的鍵盤、標(biāo)準(zhǔn)輸出文件(stdout)和標(biāo)準(zhǔn)錯誤輸出文件(stderr),后兩個文件都對應(yīng)被重定向到終端的屏幕,以便我們能直接看到輸出內(nèi)容。進程將從標(biāo)準(zhǔn)輸入文件中得到輸入數(shù)據(jù),將正常輸出數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出文件,而將錯誤信息送到標(biāo)準(zhǔn)錯誤文件中。
比如我們要查看之前從?/etc
?目錄下拷貝來的?passwd
?文件:
cd /home/shiyanlou
cp /etc/passwd passwd
cat passwd
可以加上?-n
?參數(shù)顯示行號:
cat -n passwd
nl
?命令,添加行號并打印,這是個比?cat -n
?更專業(yè)的行號打印命令。
常用的幾個參數(shù):
-b : 指定添加行號的方式,主要有兩種:-b a:表示無論是否為空行,同樣列出行號("cat -n"就是這種方式)-b t:只列出非空行的編號并列出(默認(rèn)為這種方式)
-n : 設(shè)置行號的樣式,主要有三種:-n ln:在行號字段最左端顯示-n rn:在行號字段最右邊顯示,且不加 0-n rz:在行號字段最右邊顯示,且加 0
-w : 行號字段占用的位數(shù)(默認(rèn)為 6 位)
使用?more
?和?less
?命令分頁查看文件
?more
?和?less
?是用來"閱讀"一個文件的內(nèi)容的。其中?more
?命令比較簡單,只能向一個方向滾動,而?less
?為基于?more
?和?vi
?(一個強大的編輯器)開發(fā),功能更強大。less
?的使用基本和?more
?一致,具體使用請查看 man 手冊,這里只介紹?more
?命令的使用。
使用?more
?命令打開?passwd
?文件:
more passwd
打開后默認(rèn)只顯示一屏內(nèi)容,終端底部顯示當(dāng)前閱讀的進度。可以使用?Enter
?鍵向下滾動一行,使用?Space
?鍵向下滾動一屏,按下?h
?顯示幫助,q
?退出。
使用?head
?和?tail
?命令查看文件
這兩個命令,一個是只查看文件的頭幾行(默認(rèn)為 10 行,不足 10 行則顯示全部)和尾幾行。
tail /etc/passwd
可以直接的只看一行, 加上?-n
?參數(shù),后面緊跟行數(shù):
tail -n 1 /etc/passwd
關(guān)于?tail
?命令,不得不提的還有它一個很牛的參數(shù)?-f
,這個參數(shù)可以實現(xiàn)不停地讀取某個文件的內(nèi)容并顯示。這可以讓我們動態(tài)查看日志,達到實時監(jiān)視的目的。
3.6?查看文件類型
可以使用?file
?命令查看文件的類型:
file /bin/ls
3.7?編輯文件
輸入如下命令開始:
vimtutor
4、環(huán)境變量與文件查找
1、環(huán)境變量
使用?declare
?命令創(chuàng)建一個變量名為 tmp 的變量:
declare tmp
也可以不用 declare 預(yù)聲明一個變量,直接即用即創(chuàng)建。
使用?=
?號賦值運算符,將變量 tmp 賦值為 shiyanlou。注意,與其他語言不同的是, Shell 中的賦值操作,=
?兩邊不可以輸入空格,否則會報錯。
# 正確的賦值
tmp=shiyanlou# 錯誤的賦值
tmp = shiyanlou
取變量的值,使用?echo
?命令和?$
?符號($ 符號用于表示引用一個變量的值):
echo $tmp
注意:并不是任何形式的變量名都是可用的,變量名只能是英文字母、數(shù)字或者下劃線,且不能以數(shù)字作為開頭。
3.1?環(huán)境變量
通常會涉及到的變量類型有三種:
- 當(dāng)前 Shell 進程私有用戶自定義變量,如上面我們創(chuàng)建的 tmp 變量,只在當(dāng)前 Shell 中有效。
- Shell 本身內(nèi)建的變量。
- 從自定義變量導(dǎo)出的環(huán)境變量。
也有三個與上述三種環(huán)境變量相關(guān)的命令:set
,env
,export
。這三個命令很相似,都是用于打印環(huán)境變量信息,區(qū)別在于涉及的變量范圍不同。詳見下表:
命 令 | 說 明 |
---|---|
set | 顯示當(dāng)前 Shell 所有變量,包括其內(nèi)建環(huán)境變量(與 Shell 外觀等相關(guān)),用戶自定義變量及導(dǎo)出的環(huán)境變量。 |
env | 顯示與當(dāng)前用戶相關(guān)的環(huán)境變量,還可以讓命令在指定環(huán)境中運行。 |
export | 顯示從 Shell 中導(dǎo)出成環(huán)境變量的變量,也能通過它將自定義變量導(dǎo)出為環(huán)境變量。 |
關(guān)于哪些變量是環(huán)境變量,可以簡單地理解成在當(dāng)前進程的子進程有效則為環(huán)境變量,否則不是。
3.2?命令的查找路徑與順序
查看?PATH
?環(huán)境變量的內(nèi)容:
echo $PATH
練習(xí)
創(chuàng)建一個 Shell 腳本文件,可以使用 gedit,vim,sublime 等工具編輯。如果直接復(fù)制的話,建議使用 gedit 或者 sublime,否則可能導(dǎo)致代碼縮進混亂。
cd /home/shiyanlou
touch hello_shell.sh
gedit hello_shell.sh
在腳本中添加如下內(nèi)容,保存并退出。
注意不要省掉第一行,這不是注釋,有用戶反映有語法錯誤,就是因為沒有了第一行。
#!/bin/bashfor ((i=0; i<5; i++));doecho "hello shell"
doneexit 0
為文件添加可執(zhí)行權(quán)限,否則執(zhí)行會報錯沒有權(quán)限:
chmod 755 hello_shell.sh
執(zhí)行腳本:
cd /home/shiyanlou
./hello_shell.sh
創(chuàng)建一個 C 語言?hello world
?程序:
cd /home/shiyanlou
gedit hello_world.c
?保存后使用 gcc 生成可執(zhí)行文件:
gcc -o hello_world hello_world.c
在?/home/shiyanlou
?家目錄創(chuàng)建一個?mybin
?目錄,并將上述?hello_shell.sh
?和?hello_world
?文件移動到其中:
cd /home/shiyanlou
mkdir mybin
mv hello_shell.sh hello_world mybin/
現(xiàn)在你可以在?mybin
?目錄中分別運行你剛剛創(chuàng)建的兩個程序:
cd mybin
./hello_shell.sh
./hello_world
3.3?添加自定義路徑到“ PATH ”環(huán)境變量
?PATH
?里面的路徑是以?:
?作為分割符的,所以我們可以這樣添加自定義路徑:
PATH=$PATH:/home/shiyanlou/mybin
注意這里一定要使用絕對路徑。
在每個用戶的 home 目錄中有一個 Shell 每次啟動時會默認(rèn)執(zhí)行一個配置腳本,以初始化環(huán)境,包括添加一些用戶自定義環(huán)境變量等等。實驗樓的環(huán)境使用的 Shell 是 zsh,它的配置文件是?.zshrc
,相應(yīng)的如果使用的 Shell 是 Bash,則配置文件為?.bashrc
。它們在?etc
?下還都有一個或多個全局的配置文件,不過我們一般只修改用戶目錄下的配置文件。Shell 的種類有很多,可以使用?cat /etc/shells
?命令查看當(dāng)前系統(tǒng)已安裝的 Shell。
可以簡單地使用下面命令直接添加內(nèi)容到?.zshrc
?中:
echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
上述命令中?>>
?表示將標(biāo)準(zhǔn)輸出以追加的方式重定向到一個文件中,注意前面用到的?>
?是以覆蓋的方式重定向到一個文件中,使用的時候一定要注意分辨。在指定文件不存在的情況下都會創(chuàng)建新的文件。
3.4 修改和刪除已有變量
變量修改
變量的修改有以下幾種方式:
變量設(shè)置方式 | 說明 |
---|---|
${變量名#匹配字串} | 從頭向后開始匹配,刪除符合匹配字串的最短數(shù)據(jù) |
${變量名##匹配字串} | 從頭向后開始匹配,刪除符合匹配字串的最長數(shù)據(jù) |
${變量名%匹配字串} | 從尾向前開始匹配,刪除符合匹配字串的最短數(shù)據(jù) |
${變量名%%匹配字串} | 從尾向前開始匹配,刪除符合匹配字串的最長數(shù)據(jù) |
${變量名/舊的字串/新的字串} | 將符合舊字串的第一個字串替換為新的字串 |
${變量名//舊的字串/新的字串} | 將符合舊字串的全部字串替換為新的字串 |
比如可以修改前面添加到 PATH 的環(huán)境變量,將添加的 mybin 目錄從環(huán)境變量里刪除。為了避免操作失誤導(dǎo)致命令找不到,我們先將 PATH 賦值給一個新的自定義變量 mypath:
mypath=$PATH
echo $mypath
mypath=${mypath%/home/shiyanlou/mybin}
# 或使用通配符 * 表示任意多個任意字符
mypath=${mypath%*/mybin}
變量刪除
可以使用?unset
?命令刪除一個環(huán)境變量:
unset mypath
3.5?讓環(huán)境變量立即生效
在 Shell 中修改了一個配置腳本文件之后(比如 zsh 的配置文件 home 目錄下的?.zshrc
),每次都要退出終端重新打開甚至重啟主機之后其才能生效,很是麻煩,我們可以使用?source
?命令來讓其立即生效,如:
cd /home/shiyanlou
source .zshrc
source
?命令還有一個別名就是?.
,上面的命令如果替換成?.
?的方式就該是:
. ./.zshrc
在使用?.
?的時候,需要注意與表示當(dāng)前路徑的那個點區(qū)分開。
注意第一個點后面有一個空格,而且后面的文件必須指定完整的絕對或相對路徑名,source
?則不需要。
2、搜索文件
與搜索相關(guān)的命令常用的有?whereis
,which
,find
?和?locate
。
whereis
?簡單快速
whereis who
whereis find
whereis find
?找到了三個路徑,兩個可執(zhí)行文件路徑和一個 man 在線幫助文件所在路徑,這個搜索很快,因為它并沒有從硬盤中依次查找,而是直接從數(shù)據(jù)庫中查詢。
whereis
?只能搜索二進制文件(-b
),man 幫助文件(-m
)和源代碼文件(-s
)。如果想要獲得更全面的搜索結(jié)果可以使用?locate
?命令。
locate
?快而全
使用?locate
?命令查找文件也不會遍歷硬盤,它通過查詢?/var/lib/mlocate/mlocate.db
?數(shù)據(jù)庫來檢索信息。不過這個數(shù)據(jù)庫也不是實時更新的,系統(tǒng)會使用定時任務(wù)每天自動執(zhí)行?updatedb
?命令來更新數(shù)據(jù)庫。所以有時候你剛添加的文件,它可能會找不到,需要手動執(zhí)行一次?updatedb
?命令(在我們的環(huán)境中必須先執(zhí)行一次該命令)。注意這個命令也不是內(nèi)置的命令,在部分環(huán)境中需要手動安裝,然后執(zhí)行更新。
sudo apt-get update
sudo apt-get install locate
sudo updatedb
它可以用來查找指定目錄下的不同文件類型,如查找?/etc
?下所有以 sh 開頭的文件:
locate /etc/sh
查找?/usr/share/
?下所有 jpg 文件:
locate /usr/share/*.jpg
環(huán)境里使用 zsh,在?
~/.zshrc
?文件里添加了?setopt nonomatch
?配置,這樣就不會自動處理和修復(fù)命令,因此可以不使用?\
?轉(zhuǎn)義。如果其他環(huán)境中執(zhí)行該命令提示?zsh: no matches found: /usr/share/*.jpg
,則可以在?.zshrc
?中添加上述配置,或者使用?\
?轉(zhuǎn)義。
如果想只統(tǒng)計數(shù)目可以加上?-c
?參數(shù),-i
?參數(shù)可以忽略大小寫進行查找,whereis
?的?-b
、-m
、-s
?同樣可以使用。
which
?小而精
which
?本身是 Shell 內(nèi)建的一個命令,通常使用?which
?來確定是否安裝了某個指定的程序,因為它只從?PATH
?環(huán)境變量指定的路徑中去搜索命令并且返回第一個搜索到的結(jié)果。也就是說,我們可以看到某個系統(tǒng)命令是否存在以及執(zhí)行的到底是哪一個地方的命令。
which man
which nginx
which ping
find
?精而細(xì)
find
?是這幾個命令中最強大的了,它不但可以通過文件類型、文件名進行查找而且可以根據(jù)文件的屬性(如文件的時間戳,文件的權(quán)限等)進行搜索。find
?命令強大到,要把它講明白至少需要單獨好幾節(jié)課程才行,我們這里只介紹一些常用的內(nèi)容。
這條命令表示去?/etc/
?目錄下面 ,搜索名字叫做 interfaces 的文件或者目錄。這是?find
?命令最常見的格式,千萬記住?find
?的第一個參數(shù)是要搜索的地方。命令前面加上?sudo
?是因為 shiyanlou 只是普通用戶,對?/etc
?目錄下的很多文件都沒有訪問的權(quán)限,如果是 root 用戶則不用使用。
sudo find /etc/ -name interfaces
注意 find 命令的路徑是作為第一個參數(shù)的, 基本命令格式為 find [path][option] [action] 。
與時間相關(guān)的命令參數(shù):
參數(shù) | 說明 |
---|---|
-atime | 最后訪問時間 |
-ctime | 最后修改文件內(nèi)容的時間 |
-mtime | 最后修改文件屬性的時間 |
下面以?-mtime
?參數(shù)舉例:
-mtime n
:n 為數(shù)字,表示為在 n 天之前的“一天之內(nèi)”修改過的文件-mtime +n
:列出在 n 天之前(不包含 n 天本身)被修改過的文件-mtime -n
:列出在 n 天之內(nèi)(包含 n 天本身)被修改過的文件-newer file
:file 為一個已存在的文件,列出比 file 還要新的文件名
列出 home 目錄中,當(dāng)天(24 小時之內(nèi))有改動的文件:
find ~ -mtime 0
列出用戶home目錄下比 /etc 目錄新的文件:
find ~ -newer /etc