計算機工具基礎(chǔ)(二)——Shell概念、常用POSIX命令
Shell概念
本系列博客為MIT的《Missing in CS Class(2020)》的課程筆記。
注:
<>或^在本文中指Ctrl,如c或^c指Ctrl-c
終端(命令行,CLI)
-
<Alt+T>:打開終端 -
<L>:清空終端內(nèi)容
流的概念
文件被視為連續(xù)的字節(jié)流進行處理。文件分為普通文件與設(shè)備文件。
-
普通文件:分為文本文件、二進制文件
-
設(shè)備文件:在Linux上,一切皆文件。操作系統(tǒng)有一組預(yù)定義的設(shè)備文件:標(biāo)準(zhǔn)設(shè)備文件。當(dāng)進程運行時,操作系統(tǒng)會為每個進程自動打開標(biāo)準(zhǔn)設(shè)備文件。常見的標(biāo)準(zhǔn)設(shè)備文件:
-
標(biāo)準(zhǔn)輸入流(
stdin),通常為鍵盤,文件描述符為0。 -
標(biāo)準(zhǔn)輸出流(
stdout),通常為顯示器,文件描述符為1。 -
標(biāo)準(zhǔn)錯誤流(
stderr),文件描述符為2。
-
路徑
- 路徑分隔符:
\(Windows)/(Linux) - 根目錄:最頂層的目錄。Windows:
盤符:\;Linux:/。 - 絕對路徑:以根目錄起始的路徑
- 相對路徑:以當(dāng)前工作目錄起始的路徑
.:當(dāng)前工作目錄..:父目錄
~:當(dāng)前用戶的根工作目錄-:上次所在目錄
通配符
*:匹配任意長度\(\ge 0\)的字符?:匹配任意單個字符{}:表示某種集合,用于解釋器的自動展開。如*{.c,.py}表示任意擴展名為c及py的文件
環(huán)境變量
- Linux:
$PATH。不同路徑采用:分隔 - Windows:
%PATH%。不同路徑下采用;分隔。 - 當(dāng)輸入命令時,操作系統(tǒng)首先進入環(huán)境變量中順序遍歷尋找命令中使用的程序。
權(quán)限模型
在Linux下的權(quán)限模型中,每個文件/目錄都具有權(quán)限控制。權(quán)限屬于元信息,存儲在對象的inode節(jié)點內(nèi)。權(quán)限分為三種:
r:讀。對于文件,代表可讀取其中內(nèi)容;對于目錄,代表可查看目錄中的內(nèi)容w:寫。對于文件,代表可修改其中內(nèi)容;對于目錄,代表能修改該目錄的內(nèi)容,包括新建、刪除、移動/重命名其中的文件或該目錄本身。若僅對該目錄中的文件可寫,但對該目錄不可寫,則只能修改文件本身的內(nèi)容,但無法刪除文件。x:執(zhí)行。對于文件,代表可執(zhí)行此文件;對于目錄,代表能否進入該目錄。注意與r權(quán)限區(qū)分,進入目錄與查看目錄內(nèi)容是不同的,進入目錄是最基本的權(quán)限。僅當(dāng)對目錄擁有x權(quán)限,才能對目錄進行其他權(quán)限的操作。
Shell提示符(PS1)
Shell解釋器配置文件位于用戶主目錄下以rc為后綴的隱藏文件。如bash則為~/.bashrc。
下面以bash為例,進入終端后:Username@Hostname:dir type
-
Username:當(dāng)前賬戶名,可使用whoami程序查看 -
Hostname:當(dāng)前主機名,可使用hostname程序查看 -
dir:當(dāng)前工作目錄。- 可使用
pwd程序查看當(dāng)前工作目錄。 - 若要切換工作目錄,可使用
cd dir(Change Dir)。當(dāng)對dir有執(zhí)行權(quán)限(x)時,更改當(dāng)前工作目錄至dir。
- 可使用
-
type:當(dāng)前賬戶的類型。$:非超級管理員(superadmin)賬戶;#:superadmin賬戶,默認唯一的superadmin賬戶為root,uid=0-
sudo command:在非superadmin賬戶下,以root身份進行執(zhí)行命令。不切換$PATH。sudo需要輸入當(dāng)前賬戶密碼 -
su [username=root]:切換其他賬戶,需要輸入對方賬戶密碼。不切換pwd、$PATH等
su -username:切換其他賬戶。切換pwd、$PATH等
-
命令、程序及常用程序
- 命令:由若干個可能帶有選項參數(shù)的程序組合而成的一組指令。在命令中使用后綴
&使其在后臺運行。
程序
-
程序選項:以
-或--開頭,位于程序之后。-后的選項為選項的簡寫,--后的選項為其完整寫法。 -
程序的返回值:
0表示正常返回,非0代表出現(xiàn)錯誤。如C中main函數(shù)的return,實質(zhì)上是在向操作系統(tǒng)返回程序運行結(jié)果。布爾型程序true永遠返回0,false永遠返回1。 -
邏輯運算:程序返回值的可參與邏輯運算,也被稱為短路運算。
-
&&:和運算符。對于一條含有該運算符的命令,僅當(dāng)先前程序均執(zhí)行成功(返回值均為0)時,才繼續(xù)執(zhí)行之后的程序;當(dāng)某個程序執(zhí)行失敗(返回值非0)時,停止執(zhí)行該命令。 -
||:或運算符,對于一條含有該運算符的命令,只要有程序執(zhí)行成功(返回值為0),停止執(zhí)行該命令。
-
常用程序
-
man program:程序幫助手冊。 -
which program:打印程序所在的絕對路徑 -
date:輸出系統(tǒng)日期 -
echo string:打印,將string打印至stdout -
ls dir:查看某一目錄下包含的文件/目錄。若不指定dir,則默認為當(dāng)前工作目錄。
選項:-l:查看某一目錄下文件/目錄的詳細元信息。例:
typepermission_string link_number owner groups number update_time nametype:-或d。d代表其為一個目錄,-表示其為一個普通文件。permission_string:長度為9的權(quán)限字符串,每3個一組。每組順次代表為該對象的所有者(Owner)、用戶組(Groups)、其他人(Others)的權(quán)限。若有權(quán)限則用權(quán)限名表示;-表示無該權(quán)限。可用chmod命令修改權(quán)限。chmod +name表示授予權(quán)限,chmod -name表示移除權(quán)限number:對于普通文件,表示文件的字節(jié)數(shù);對于目錄,表示目錄項的數(shù)量。某一目錄的目錄項=普通文件數(shù)量+\(\sum\)子目錄的目錄項數(shù)+1(表示..,父目錄)update_time:表示最后的修改時間。使用touch name修改文件/目錄的更新時間,使用選項-t YYYYMMDDhhmm.ss修改為指定時間YYYY-MM-DD hh:mm:ss。若操作對象不存在,則新建空白文件。
-
find:find dir options expression:從dir開始進行查找。- 選項:
-name "string":以對象名進行查找,可查找文件名、路徑名。可使用通配符。 -type type:type:f或d
- 選項:
-
diff:Difference,將兩對象差異輸出至stdout。diff file1 file2:輸出兩文件差異。僅在file1中的內(nèi)容前用表示,僅在`file2`中的內(nèi)容前用表示。- 選項:
-r dir1 dir2:遞歸輸出兩目錄差異。 - 選項:
-u file1 file2:以人類友好的方式輸出差異。 - 選項:
-q file1 file2:只判斷是否有差異,不輸出差異內(nèi)容。
-
grep:文本的模式匹配grep "pattern" file,file可使用通配符。- 選項:
-i:忽略模式串大小寫 -r:遞歸搜索目錄下所有文件
- 選項:
-
mv:Move,移動文件/目錄-
mv file newdir:移動文件file至新目錄newdir。file數(shù)量可不固定,且可使用通配符。若newdir不存在,則操作失敗。如:將所有擴展名為.cpp的文件移動到目錄./1中:mv *.cpp ./1 -
mv oldname newname:若newname不存在,則對操作對象重命名;若newname存在:對于文件,則操作對象會替換newname,對于目錄,則操作對象會被移動并成為newname的子目錄。
-
-
cp:Copy,復(fù)制文件/目錄-
cp file1 file2:復(fù)制文件。若file2已存在,則其將被替換 -
選項:
-r dir1 dir2:遞歸復(fù)制文件夾內(nèi)所有文件。若dir2已存在,則dir1被復(fù)制成為dir2的子目錄。
-
-
mkdir dir:Make Dir,新建空文件夾- 選項:
-p:逐級創(chuàng)建目錄,若不存在就創(chuàng)建它
- 選項:
-
rm:Remove,刪除操作對象rm file:刪除文件- 選項:
-r dir:遞歸刪除文件夾下的所有內(nèi)容
-
rmdir dir:當(dāng)該文件夾為空時,則刪除 -
cat file:打印文件全部內(nèi)容至stdout -
tail file:打印文件末尾內(nèi)容。默認查看最后\(10\)行
選項:-n number:打印文件末尾number行 -
tee file:將stdin同時寫入stdout與file中 -
journalctl:打印系統(tǒng)日志 -
alias newname="oldname":為命令設(shè)置別名 -
jobs:工作管理指令 -
ssh Username@RemoteHost:ssh登錄主機RemoteHost,默認端口22。默認以密碼登錄。- 選項:
-p port:指定主機端口
- 選項:
-
scp options SourceFile TargetPath:主機間復(fù)制文件。僅支持本地與遠程,不支持遠程與遠程。- 接受遠程地址:
Username@RemoteHost:Path - 選項:
-r:遞歸復(fù)制文件夾內(nèi)所有文件
-P port:指定主機端口
- 接受遠程地址:
-
ftp:文件傳輸協(xié)議(File Transport Protool)ftp RemoteHost:連接到遠程主機,默認端口21。若支持匿名則直接登錄,否則以交互式詢問賬戶密碼。ls:列出遠程目錄pwd:打印遠程所在目錄lpwd:打印本地所在目錄cd:切換遠程目錄lcd:切換本地目錄mkdir:在遠程新建文件夾rmdir:在遠程刪除文件夾delete:刪除遠程單個文件mdelete:刪除遠程多個文件rename:重命名遠程文件chmod:設(shè)置遠程文件權(quán)限ascii、binary:設(shè)置傳輸模式為ACSII或二進制。get:下載文件mget:批量下載文件,常與通配符結(jié)合使用。put:上傳文件mput:批量上傳文件,常與通配符結(jié)合使用。bye/quit:退出- 不支持移動和復(fù)制文件。
-
sftp:基于SSH的文件傳輸協(xié)議,為SSH的子系統(tǒng),與FTP是兩種截然不同的協(xié)議。下面僅列出與ftp不同的命令:sftp Username@RemoteHost:連接到遠程主機,默認端口22。需顯式指定用戶名。rm:刪除文件。get:下載單個文件,可使用-r選項遞歸下載文件。不支持mget。put:上傳單個文件,使用-r選項遞歸上傳文件。不支持mput。bye/exit:退出- 不支持移動和復(fù)制文件。
流的重定向、連接
-
重定向輸出流:
>、>><command> > file:覆蓋地重定向輸出流至文件<command> >> file:追加地重定向輸出流至文件
例:echo命令通過重定向輸出流的方式,可將字符串打印進文件中:echo string > filen > file:將文件描述符為n的文件覆蓋地重定向到文件。
如1 > file:將stdout重定向到filen >> file:將文件描述符為n的文件追加地重定向到文件。n >& m:將文件描述符n的輸出重定向到文件描述符m。如command 2>&1:將stderr重定向到stdout
-
重定向輸入流:
<< file:重定向輸入流自文件,輸入來自文件。
例:cat file命令的本質(zhì)即為cat < file,通過重定向輸入流以讀取某文件內(nèi)容并打印。n <& m:將文件描述符m的輸入重定向到文件描述符n。
-
例:使用
cat命令實現(xiàn)文件復(fù)制:cat < file1 > file2,cat起到作為中轉(zhuǎn)站的作用。-
cat的輸入流被重定向至file1,其內(nèi)容被讀入cat中 -
cat的輸出流被重定向自file2,其內(nèi)容被打印進file2中
-
-
管道符:
|,位于兩程序之間,用于連接它們的流。用法:program1 | program2,將program1的stdout作為program2的stdin。
進程通信
進程間通過信號進行通信。信號從1開始編號。
信號可由進程發(fā)出,也可用戶手動發(fā)出:kill -SIGid PID
常用信號:
| 信號編號 | 信號名稱 | 信號含義 |
|---|---|---|
| 1 | SIGHUP | 終端掛起/控制進程結(jié)束br/若要忽略該信號,在運行程序的命令前使用nohup,或?qū)σ堰\行的程序使用disown |
| 2 | SIGINT | 中斷(Ctrl-C) |
| 3 | SIGQUIT | 終止(Ctrl-\) |
| 9 | SIGKILL | 強制終止 |
| 11 | SIGSEGV | 段錯誤 |
| 15 | SIGTERM | 終止信號,通常為kill命令發(fā)送的信號 |
| 18 | SIGCONT | 繼續(xù)執(zhí)行暫停進程 |
| 19 | SIGSTOP | 暫停進程 |
| 20 | SIGTSTP | 終端掛起(Terminal Stop,CTRL-Z)br/之后可通過fg或bg分別在前臺/后臺繼續(xù)進程 |

浙公網(wǎng)安備 33010602011771號