計(jì)算機(jī)教育中缺失的一課:Shell

同學(xué)們,大家好狼渊,今天我是來補(bǔ)課的拴念。

上一篇」把命令行、終端春畔、Shell 搞清楚后(還沒搞清楚的可以點(diǎn)擊藍(lán)字過去看一眼)脱货,今天這篇寫起來就順暢多了岛都。哦,極度的舒適振峻!

開門見山地說吧臼疫。大學(xué)里的計(jì)算機(jī)課程通常專注于講授計(jì)算機(jī)操作系統(tǒng)、計(jì)算機(jī)組成原理扣孟、計(jì)算機(jī)網(wǎng)絡(luò)等學(xué)院派的課程烫堤,以及某一門具體的編程語言,比如說 Java凤价、C++/C鸽斟,而對于如何精通工具這個(gè)主題往往不在講授的課程之內(nèi),需要同學(xué)們自行摸索利诺。

但實(shí)際上呢富蓄,某些工具的使用頻率高到可以使用一個(gè)成語來形容——朝夕相伴。比如說命令行慢逾,不僅在學(xué)生時(shí)代經(jīng)常用到立倍,工作后更是形影不離。因此氛改,花一些時(shí)間來打磨使用這些工具的能力就變得迫在眉睫帐萎。比如說今天的主角——命令行 Shell,項(xiàng)目的運(yùn)維基本上都是通過 Shell 完成的胜卤。

記得剛參加工作那會疆导,需要向一名前輩請教線上部署的問題。我站在他的身后葛躏,看著他靈巧地手指在鍵盤上熟練地操作著澈段,黑色的 XShell 窗口里,彩色的字符在愉快地跳躍著舰攒,有一種杰倫在鋼琴上彈奏《逆鱗狂想曲》的感覺败富,特別崇拜。

01摩窃、再說 Shell 是什么

現(xiàn)代計(jì)算機(jī)的交互接口多種多樣兽叮,從常見的圖形化界面,到語音輸入猾愿,再到 AR 和 VR鹦聪,都可以滿足指令的輸入。這些接口可以覆蓋絕大多數(shù)的應(yīng)用場景蒂秘,但它們從根本上限制了另外一種操作方式——你不能點(diǎn)擊一個(gè)不存在的按鈕泽本,或者使用語音輸入一個(gè)還沒錄入的指令。

為了能充分地利用計(jì)算機(jī)的能力姻僧,我們有時(shí)候不得不回到最原始的交互方式——文字接口:Shell规丽,一個(gè)用 C 語言編寫的程序蒲牧,它是用戶使用 Linux 的橋梁。

幾乎所有的操作系統(tǒng)都支持某種形式的命令行 Shell赌莺,有些甚至提供了多種 Shell 可供選擇冰抢。Linux 上常見的 Shell 有:

  • Bourne Shell(/usr/bin/sh 或 /bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

雖然細(xì)節(jié)上有些許差異,但核心功能是一樣的:允許你執(zhí)行程序艘狭,輸入指令并獲取某種半結(jié)構(gòu)化的輸出晒屎。

可通過 cat /etc/shells 命令來顯示本機(jī)上的 Shell。我用的 Mac缓升,上面有 bash、csh蕴轨、ksh港谊、sh、tcsh橙弱、zsh 等等歧寺。

默認(rèn)是 zsh,在窗口標(biāo)題上可以看得出來棘脐。如果想切換到另外一種 Shell斜筐,可以直接敲 Shell 的名字,比如 tcsh蛀缝,見下圖顷链。

害,一不小心還是暴露了自己的名字屈梁。如果想退出當(dāng)前 Shell 到默認(rèn) Shell 的話嗤练,敲 exit 命令就可以了。

02在讶、初用 Shell

在啟動臺找到“終端”煞抬,打開(我用的 Mac),如下圖所示构哺。

先從窗口標(biāo)題說起革答,重點(diǎn)是 zsh。

2019 年曙强,Apple 發(fā)布了新一代 macOS——macOS Catalina残拐,為專業(yè)用戶帶來了一項(xiàng)重大變化,zsh 取代了 bash旗扑,成為默認(rèn)的 Shell蹦骑。相比 bash,zsh 擁有更強(qiáng)大的功能臀防,比如說更智能的自動補(bǔ)全眠菇、更豐富的主題等等边败。這逼絕對是馬車中的跑車,跑車中的飛行車捎废,史稱「終極 Shell」笑窜。

再說說窗體內(nèi)容。

第一行內(nèi)容顯示了最近一次的登錄時(shí)間登疗。有些同學(xué)會好奇排截,“ttys000”是什么鬼?

簡單來說辐益,tty 是終端的統(tǒng)稱断傲。看過「終于制服了它們」的同學(xué)應(yīng)該知道了智政,早期的終端是電傳字打印機(jī)(Teletype / Teletypewriter)认罩,英文縮寫就是 tty。雖然終端設(shè)備已經(jīng)不再限制于電傳打字機(jī)了续捂,但是 tty 這個(gè)名稱還是就這么保留了下來垦垂。

“ttys000” 就是 tty 加了一個(gè)代號 s000。

第二行內(nèi)容告訴我們牙瓢,主機(jī)名是 itwanger劫拗。可通過「系統(tǒng)偏好設(shè)置」→「共享」→「電腦名稱」→「編輯」修改主機(jī)名矾克。% 后面跟了一個(gè)提示符页慷,可以在此輸入任意字符,只不過有些可以被 Shell 解析聂渊,有些則不能差购。

03、Oh My Zsh

zsh 本身非常強(qiáng)大汉嗽,但配置復(fù)雜欲逃,對普通用來來說體驗(yàn)非常差。直到有一天饼暑,有個(gè)無聊的家伙開發(fā)出了一個(gè)能夠快速配置 zsh 的項(xiàng)目稳析,叫做「Oh My Zsh」,GitHub 地址如下所示:

https://github.com/ohmyzsh/ohmyzsh

這玩意安裝起來極為簡單弓叛,能夠讓我們神功速成彰居,有點(diǎn)「五分鐘學(xué)會 XXX」的味道。

直接在終端里執(zhí)行 sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" 就可以自動安裝 Oh My Zsh 了撰筷。

如果自動安裝失敗的話陈惰,可以嘗試手動安裝。

git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

由于某些原因毕籽,速度可能會比較慢抬闯,耐心地等待一會井辆。

安裝完成后重新打開一個(gè)新的終端,就可以看到彩色的提示符(Oh My Zsh 默認(rèn)主題的標(biāo)志)了溶握。

Oh My Zsh 的配置集中在 ~/.zshrc 文件里(~/ 表示根目錄)杯缺,可以通過 vim 打開。

vim ~/.zshrc

可以看到睡榆,Oh My Zsh 默認(rèn)使用的主題是 robbyrussell萍肆,可在 ~/.oh-my-zsh/themes 目錄下找到更多主題進(jìn)行切換。

如果你不知道選擇哪個(gè)主題胀屿,可以通過下面的網(wǎng)址進(jìn)行預(yù)覽塘揣。

https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes

如果你有選擇困難癥,可以像我一樣宿崭,配置成隨機(jī)勿负,每新開一次窗口,Oh My Zsh 就替你選一次劳曹。

ZSH_THEME="random"

現(xiàn)在,就新開一個(gè)窗口吧琅摩,可以看到主題隨機(jī)到了 essembeh铁孵。

再來說說插件。Oh My Zsh 提供了完善的插件體系房资,默認(rèn)有 100 多種蜕劝,可以在 ~/.oh-my-zsh/plugins 目錄下找到這些插件。如果不確定這些插件是干嘛的轰异,可以查看一下插件目錄下對應(yīng)的 README.md 文件岖沛。插件的配置同樣在 .zshrc 文件里,目前默認(rèn)的插件只有 git搭独。

到此為止婴削,Oh My Zsh 的安裝、配置牙肝、插件完成了三位一體唉俗,終極 Shell 全面登場。

04配椭、再用 Shell

來執(zhí)行一個(gè)最簡單的命令 date虫溜,不出意外的話,它將會打印出當(dāng)前的日期和時(shí)間股缸。

然后衡楞,光標(biāo)等待我們輸入其他命令,我們可以在執(zhí)行命令的時(shí)候帶上參數(shù)敦姻。

echo hello

echo 命令會將參數(shù) hello 打印出來瘾境,Shell 是基于空格分隔命令進(jìn)行解析的歧杏,第一個(gè)單詞代表可執(zhí)行的程序,后續(xù)的單詞作為傳遞給程序的參數(shù)寄雀。如果你希望參數(shù)里包含空格的話得滤,可以使用單引號或者雙引號包裹起來。

echo "hello world"

當(dāng)我們在 Shell 中執(zhí)行命令時(shí)盒犹,實(shí)際上是在執(zhí)行一段 Shell 可以解釋執(zhí)行的簡單代碼懂更。如果命令不是 Shell 的預(yù)知范圍之內(nèi)的話,它會去咨詢環(huán)境變量 $PATH急膀。

可以使用 which 命令來確定某個(gè)程序名代表的是哪個(gè)具體的程序沮协。也可以繞過 $PATH,直接使用帶路徑的命令來執(zhí)行卓嫂,比如 /bin/date慷暂。

Shell 中的路徑是一組被分割的目錄,在 Linux 和 macOS 上使用的 / 分割晨雳,在 Windows 上是 \行瑞,正因?yàn)檫@樣,我們在編程的時(shí)候一定要先獲取系統(tǒng)的分隔符(Java 是 File.separator 獲取的)餐禁,不然會導(dǎo)致程序在不同的操作系統(tǒng)下無法執(zhí)行血久!

如果某個(gè)路徑以 / 開頭,那么它就是一個(gè)絕對路徑帮非,其他都是相對路徑氧吐。當(dāng)前工作目錄可以通過 pwd 命令來獲取,切換目錄通過 cd 命令末盔。. 表示的是當(dāng)前目錄筑舅,.. 表示上級目錄。

Shell 會實(shí)時(shí)顯示當(dāng)前的路徑信息陨舱〈浼穑可以通過 ls 命令查看當(dāng)前目錄下包含哪些文件,安裝了 Oh My Zsh 后游盲,還可以通過 ll(其實(shí)是 ls -l 的簡寫)顯示文件或者文件夾的詳細(xì)信息心剥。

簡單來介紹一下文件屬性,以后會很有用背桐。

  • d:第 1 位表示文件類型优烧,d 是目錄、l 是鏈接文件链峭、- 是普通文件畦娄。
  • rwx:第 2-4 位表示這個(gè)文件的所有者擁有的權(quán)限,r 是讀、w 是寫熙卡、x 是執(zhí)行杖刷。
  • r-x:第 5-7 位表示和這個(gè)文件的所有者所在同一個(gè)組的用戶具有的權(quán)限症副。
  • r-x:第 8-10 位表示其他用戶所具有的權(quán)限调塌。

比如:

-rw-r--r--   1 maweiqing  staff     6B  1 12 16:35 hello.txt

表示 hello.txt 是個(gè)普通文件,maweiqing 擁有讀和寫的權(quán)限疆液,但沒有執(zhí)行的權(quán)限颓鲜,和 maweiqing 所在的同一個(gè) staff 組的用戶擁有只讀權(quán)限表窘,剩余用戶同樣。

如果你想要知道命令的參數(shù)甜滨、輸入輸出信息乐严,或者是想要了解它們的工作方式,可以試試 man 這個(gè)命令衣摩。它會接受一個(gè)程序名作為參數(shù)昂验,然后將它的文檔(用戶手冊)展現(xiàn)出來。

man ls

可以按 q 鍵退出用戶手冊艾扮。你可以趁機(jī)學(xué)習(xí)一下 mv(用于重命名或移動文件)既琴、 cp(拷貝文件)以及 mkdir(新建文件夾)這些常用命令。注意泡嘴,rm (刪除文件)這個(gè)命令一定要慎用啊呛梆,搞不好就是刪庫跑路的節(jié)奏!

在 Shell 中磕诊,程序主要有兩個(gè)流:輸入流和輸出流。當(dāng)程序嘗試讀取信息時(shí)纹腌,就從輸入流中讀撒铡;當(dāng)程序嘗試打印信息時(shí)升薯,就將信息輸出到輸出流中莱褒。通常來說,鍵盤作為輸入設(shè)備涎劈,顯示器作為輸出設(shè)備广凸。

可以使用 <> 來重定向輸入輸出流。使用 >> 將輸出以追加的方式重定向到文件蛛枚。

?  itwanger echo hello > hello.txt
?  itwanger cat hello.txt
hello
?  itwanger cat < hello.txt 
hello
?  itwanger cat < hello.txt > hello1.txt
?  itwanger cat hello1.txt 
hello
?  itwanger echo world >> hello.txt 
?  itwanger cat hello.txt 
hello
world

對于 Java 程序員來說谅海,我們通常需要在運(yùn)行環(huán)境上這樣運(yùn)行 jar 文件。& 代表在后臺運(yùn)行蹦浦。

nohup java -jar XXX.jar > out.log &

對于絕大多數(shù)的類 Unix 系統(tǒng)扭吁,有一類用戶非常特殊,就是 root 用戶,可以創(chuàng)建侥袜、讀取蝌诡、更新和刪除系統(tǒng)中的任何文件。

Unix 于 1969 年由貝爾實(shí)驗(yàn)室開發(fā)枫吧,目前主流的 Unix 系統(tǒng)有三種浦旱,分別是 AIX、HP-UX九杂、Solaris颁湖,互不兼容。Linux 于 1991 年由芬蘭大學(xué)生 Linus 開發(fā)尼酿,是一個(gè)類 Unix 系統(tǒng)爷狈,但是其代碼不源自任何 Unix 版本,完全不是 Unix 的一個(gè)分支裳擎。

通常來說涎永,我們并不會用 root 用戶直接登錄系統(tǒng),因?yàn)檫@樣可能會因?yàn)槟承╁e(cuò)誤破壞系統(tǒng)鹿响。所以在需要的時(shí)候羡微,我們會使用 sudo 命令,也就是以 su(super user)的身份去執(zhí)行一些操作惶我。

當(dāng)你遇到 permission denied(拒絕訪問)的錯(cuò)誤時(shí)妈倔,通常是因?yàn)樾枰?root 用戶才能操作的原因引起的。get 了吧绸贡?

學(xué)到這盯蝴,你掌握的 Shell 知識已經(jīng)可以完成一些基礎(chǔ)的任務(wù)了。有云服務(wù)器的同學(xué)听怕,或者安裝了虛擬機(jī)的同學(xué)捧挺,可以在上面建個(gè)臨時(shí)文件夾練習(xí)下文中提到的命令。

最后尿瞭,希望同學(xué)們都能把 Shell 用好闽烙,工作后會大有幫助的!覺得不錯(cuò)的話声搁,歡迎一鍵三連黑竞,做個(gè)帥氣美麗的三連人


推薦閱讀:

V4.0 《JavaGuide 面試突擊版》來啦疏旨!GitHub 上標(biāo)星 98.1k很魂,幫你成功上岸!

奉勸那些想把編程學(xué)好的學(xué)弟學(xué)妹們

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末檐涝,一起剝皮案震驚了整個(gè)濱河市莫换,隨后出現(xiàn)的幾起案子霞玄,更是在濱河造成了極大的恐慌,老刑警劉巖拉岁,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坷剧,死亡現(xiàn)場離奇詭異,居然都是意外死亡喊暖,警方通過查閱死者的電腦和手機(jī)惫企,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陵叽,“玉大人狞尔,你說我怎么就攤上這事」簦” “怎么了偏序?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胖替。 經(jīng)常有香客問我研儒,道長,這世上最難降的妖魔是什么独令? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任端朵,我火速辦了婚禮,結(jié)果婚禮上燃箭,老公的妹妹穿的比我還像新娘冲呢。我一直安慰自己,他們只是感情好招狸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布敬拓。 她就那樣靜靜地躺著,像睡著了一般裙戏。 火紅的嫁衣襯著肌膚如雪乘凸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天挽懦,我揣著相機(jī)與錄音,去河邊找鬼木人。 笑死信柿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的醒第。 我是一名探鬼主播渔嚷,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稠曼!你這毒婦竟也來了形病?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漠吻,沒想到半個(gè)月后量瓜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡途乃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年绍傲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耍共。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烫饼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出试读,到底是詐尸還是另有隱情杠纵,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布钩骇,位于F島的核電站比藻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏伊履。R本人自食惡果不足惜韩容,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唐瀑。 院中可真熱鬧群凶,春花似錦、人聲如沸哄辣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽力穗。三九已至毅弧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間当窗,已是汗流浹背够坐。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崖面,地道東北人元咙。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像巫员,于是被迫代替她去往敵國和親庶香。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

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

  • 背景工欲善其事必先利其器简识,聽說zsh很強(qiáng)大赶掖,完全兼容bash感猛,so決定一試一試。(其實(shí)是搞動態(tài)規(guī)劃代碼搞得頭皮發(fā)麻...
    計(jì)算機(jī)工程制圖閱讀 2,508評論 1 1
  • 有些同學(xué)可能對Shell不太熟悉奢赂。借用池建強(qiáng)的一個(gè)解釋:簡單的說陪白,Shell是Linux/Unix的一個(gè)外殼。它負(fù)...
    lingyv閱讀 9,184評論 1 22
  • █████╗ ██╗ ██╗███████╗███████╗ ██████╗ ███╗ ███╗████...
    若與閱讀 5,527評論 0 18
  • 一呈驶、iTerm2簡介:(轉(zhuǎn)載) Mac OS自帶的終端拷泽,用起來雖然有些不太方便,界面也不夠友好,iTerm2是一款...
    王小帥_94閱讀 1,607評論 0 1
  • 1.簡介 Mac OS自帶的終端袖瞻,用起來雖然有些不太方便司致,界面也不夠友好。iTerm2是一款相對比較好用的終端工具...
    IAM121閱讀 50,218評論 1 15