三移国、理解shell

前面兩節(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 bashbash --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)勢

例如:cdexit都是內(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中使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奠蹬,一起剝皮案震驚了整個濱河市囤躁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猜极,老刑警劉巖丢胚,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勘高,死亡現(xiàn)場離奇詭異蕊蝗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)子漩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸟妙,“玉大人重父,你說我怎么就攤上這事」幔” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵批狐,是天一觀的道長扇售。 經(jīng)常有香客問我,道長嚣艇,這世上最難降的妖魔是什么承冰? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮食零,結(jié)果婚禮上娜搂,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好谭企,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凄鼻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼璃谨。 笑死贡耽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晦譬。 我是一名探鬼主播凶硅,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沈贝!你這毒婦竟也來了昭躺?” 一聲冷哼從身側(cè)響起蛛芥,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盗棵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恶耽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拆祈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年塔插,在試婚紗的時候發(fā)現(xiàn)自己被綠了梗摇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡想许,死狀恐怖伶授,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情流纹,我是刑警寧澤糜烹,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站漱凝,受9級特大地震影響疮蹦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碉哑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一挚币、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扣典,春花似錦妆毕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至湿硝,卻和暖如春薪前,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背关斜。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工示括, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痢畜。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓垛膝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丁稀。 傳聞我的和親對象是個殘疾皇子吼拥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容