前面兩節(jié)學(xué)習(xí)了一些shell的基本命令篇恒,但是我們并不知道shell進(jìn)程的具體,本節(jié)學(xué)習(xí)一下
命令 | 作用 |
---|---|
echo |
顯示 |
bash |
啟用一個子bash shell |
exit |
退出當(dāng)前進(jìn)程 |
sleep |
進(jìn)程睡眠 |
jobs |
顯示當(dāng)前運(yùn)行在后臺模式的所有用戶的進(jìn)程 |
type |
判斷是否是內(nèi)建命令 |
history |
輸出你輸入過的命令 |
alias |
給已有的內(nèi)建命令重新命名 |
1.shell類型
先來說下shell是什么葫松,shell是Linux/Unix的一個外殼瓦糕,Linux/Unix通過shell與內(nèi)核交互,shell接收用戶或程序的命令進(jìn)而轉(zhuǎn)化成內(nèi)核明白的命令腋么,內(nèi)核完成任務(wù)后再返回有用的信息給用戶或者程序
為什么shell會有多種類型咕娄,因為有的程序員用著別人的shell不爽,就自己寫了一個shell
輸入cat /etc/shells
命令就可以查看你電腦上安裝了那些shell珊擂,我的電腦有這些
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
輸入echo $SHELL
可以查看你電腦默認(rèn)啟動的是那種shell圣勒,我的是zsh
/bin/zsh
至于默認(rèn)shell的配置,自己百度
這里極力為大家推薦zsh摧扇,GitHub地址github.com/robbyrussell/oh-my-zsh圣贸,zsh兼容bash,并提供更多更牛X的功能吁峻,大家自行下載安裝
除了打開終端和我們交互的默認(rèn)shell用含,系統(tǒng)還有一個默認(rèn)的shell是/bin/sh帮匾,用于那些需要在啟動時使用的系統(tǒng)shell腳本
*注意 當(dāng)我們自己寫bash shell腳本的時候,對于有兩個默認(rèn)的shell(默認(rèn)交互shell和默認(rèn)系統(tǒng)shell)會有問題缸夹,后面會介紹腳本首行的語法要求,避免這個問題
*注意 這一些列的學(xué)習(xí)都是基于bash而不是zsh
2.shell的父子關(guān)系
shell關(guān)系
通過實際例子了解
打開一個終端槽华,輸入命令ps -f
,會得到如下的輸出
? ~ ps -f
UID PID PPID C STIME TTY TIME CMD
501 392 292 0 一10上午 ttys000 0:00.07 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server /usr/bin/login -fpl musong /Applications/iTerm.app/Contents/MacOS/iTerm2 --launch_shell
501 394 393 0 一10上午 ttys000 0:02.32 -zsh
看到有兩個進(jìn)程趟妥,一個是命令行ps -f
啟用的進(jìn)程,一個是默認(rèn)進(jìn)程zsh
這里再解釋一下佣蓉,樓主默認(rèn)啟動的是zsh披摄,還有樓主用的是iTerm工具,可能會和系統(tǒng)命令行不一樣
再輸入命令bash
勇凭,會得到如下輸出
bash-3.2$
此時啟用了一個子bash shell
再輸入命令ps -f
疚膊,會得到如下輸出
UID PID PPID C STIME TTY TIME CMD
501 392 292 0 一10上午 ttys000 0:00.07 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server /usr/bin/login -fpl musong /Applications/iTerm.app/Contents/MacOS/iTerm2 --launch_shell
501 394 393 0 一10上午 ttys000 0:02.32 -zsh
501 34915 394 0 11:49上午 ttys000 0:00.01 bash
注意觀察最后兩行的PID(進(jìn)程編號)、PPID(父進(jìn)程編號)虾标,可能到這里大家已經(jīng)理解子shell和父shell的關(guān)系了
在上面的例子中寓盗,父shell是zsh,PID是394璧函,子shell是bash傀蚌,PID是34915,PPID是394
*注意 各種shell之間可互相創(chuàng)建子shell
*注意 這樣的層級關(guān)系可以有多層蘸吓,子shell還可以有子shell
*注意 退出當(dāng)前進(jìn)程善炫,用命令exit
另外可以通過參數(shù)修改shell的啟動方式,這里只簡單的介紹一下库继,暫時不會涉及具體問題
參數(shù) | 描述 |
---|---|
-c string | 從string中讀取命令進(jìn)行處理 |
-i | 啟動一個能夠接受用戶輸入的交互shell |
-l | 以登錄shell的形式啟動 |
-r | 啟動一個受限shell箩艺,用戶會被限制在默認(rèn)目錄中 |
-s | 從標(biāo)準(zhǔn)輸入中讀取命令 |
*注意 可以通過命令man bash
或bash --help
了解更多幫助信息
進(jìn)程列表
在一行指令之中一次運(yùn)行一系列的命令
例: pwd ; ls ; cd /etc
將命令列表變成進(jìn)程列表(實際上就是生成一個子shell去執(zhí)行這些命令)
例:(pwd ; ls ; cd /etc)
*注意 查看一個shell是否有子shell用命令echo $BASH_SUBSHELL
*注意 echo $BASH_SUBSHELL
是bash的命令,在zsh下是echo $ZSH_SUBSHELL
*注意 進(jìn)程列表實際上是一種命令分組
*注意 另一種分組方法是{}
宪萄,上面的例子等價于{pwd ; ls ; cd /etc}
静汤,但是不同的是{}
沒有生成子shell
*注意 命令分組可以嵌套使用例如:(pwd ;( ls ; cd /etc))
撒妈,這樣會生成兩個子shell
*注意 即使生成子shell也并不一定真正的是多進(jìn)程處理
子shell的經(jīng)典用法
了解后臺模式
即將任務(wù)放到后臺處理,不影響其他的操作
例:輸入命令sleep 10
命令的作用是希望進(jìn)程睡眠10秒
回車后發(fā)現(xiàn)嫁佳,進(jìn)程進(jìn)入睡眠蒿往,同時光標(biāo)也沒有了,無法進(jìn)行任何操作
例:輸入命令sleep 10&
&
作用是將命令置入后臺模式
回車后發(fā)現(xiàn)蔬充,控制臺提示
[1] 36482
[1]
是后臺作業(yè)編號,36482
是進(jìn)程ID(PID)
光標(biāo)還在庸队,也可以進(jìn)行其他操作
10秒后,控制臺突然彈出提示
[1] + 36482 done sleep 10
*注意 ps
命令也可查看后臺進(jìn)程
*注意 jobs
命令可以顯示當(dāng)前運(yùn)行在后臺模式的所有用戶的進(jìn)程
*注意 jobs -l
命令可以顯示更多關(guān)于進(jìn)程的相關(guān)信息
例:當(dāng)有后臺進(jìn)程的時候輸入jobs -l
命令,會看到下面的輸出
[1] + 36725 running ( sleep 20; )
[1]
是后臺作業(yè)編號央勒,36725
是進(jìn)程ID(PID),running
表示狀態(tài),( sleep 20; )
子shell執(zhí)行的命令
*注意 后臺進(jìn)程結(jié)束后會突然出現(xiàn)在控制臺上井濒,而不是在合適的時候顯示
如何將進(jìn)程列表置入后臺模式,很簡單者甲,只要在()
外加上&
即可
例:(pwd ; ls ; cd /etc)&
協(xié)程 coproc
可以同時做兩件事鲫懒,在后臺生成一個子shell,并在這個子shell中執(zhí)行命令
例:coproc sleep 5
生成子shell并在子shell中執(zhí)行sleep 5
*注意 不知道為什么在bash-3.2環(huán)境下不支持 coproc
命令颂翼,在zsh下就沒有問題疚鲤,還請指教
3.理解shell的內(nèi)建命令
先來區(qū)分下內(nèi)建命令和外建(外部)命令
外部命令
先來做一個操作ls /bin
桶略,控制臺的輸出結(jié)果是
[ cat cp date df echo expr kill launchctl ln mkdir pax pwd rmdir sleep sync test wait4path
bash chmod csh dd domainname ed hostname ksh link ls mv ps rm sh stty tcsh unlink zsh
這些都是外部命令
*注意 這些命令通常位于/bin惶翻、/usr/bin吕粗、/sbin或/usr/sbin中
外部命令執(zhí)行時,通常會創(chuàng)建子進(jìn)程议泵,稱為“衍生”,例如ps
命令碉京,就是一個外部命令谐宙,可自行試驗一下
內(nèi)建命令
和外鍵命令最大的區(qū)別就是內(nèi)建命令不需要子進(jìn)程來執(zhí)行厘灼,這就很容易理解內(nèi)建命令比外鍵命令的優(yōu)勢
例如:cd
、exit
都是內(nèi)建命令
可以用type
命令判斷是否是內(nèi)建命令
例如:type cd
輸出的結(jié)果是
cd is a shell builtin
這是一個bash內(nèi)建命令和保留字的列表bash內(nèi)建命令和保留字
有一些命令既是內(nèi)建命令也是外鍵命令,例如pwd
奋姿、echo
称诗,可以用type -a
查看
例:type -a echo
控制臺輸出結(jié)果
echo is a shell builtin
echo is /bin/echo
*注意 witch
命令可以顯示外鍵命令
*注意 通常使用的基本都是內(nèi)建命令计维,如果想特意使用外鍵命令只要直接指明對應(yīng)的文件即可蜈首,例如:/bin/pwd
使用外鍵pwd
命令
介紹一個命令history
history
命令會在控制臺輸出你輸入過的命令
!!
命令可以呼出你上一條輸入的命令
*注意 !!
基本用不到,現(xiàn)在的控制臺基本都支持上下鍵呼出輸入過的命令猬腰,方便快捷
!10
命令會呼出編號為10的歷史記錄
*注意 命令歷史記錄會保存在隱藏文件.bash_history中姑荷,每次shell退出時,使用過的命令會寫入.bash_history中
*注意 如果在沒退出shell的時候想強(qiáng)制寫入懈费,可以用命令history -a
命令別名 alias
給已有的內(nèi)建命令從新起個名字憎乙,有許多我們常用的命令已經(jīng)是別名该押,zsh中可以用alias
查看
alias
用法 alias li='ls -li'
即將ls -li
命令命名為li
*注意 不建議自己更改過多的名字
*注意 更改過的名字在他被定義的shell中才有用
*注意 更改過的名字在shell腳本中也可用
下一篇會介紹如果讓更改過的名字在子shell中使用