計算機教育中缺失的一課:Shell

同學們,大家好,今天我是來補課的。

上一篇」把命令行、終端、Shell 搞清楚后(還沒搞清楚的可以點擊藍字過去看一眼),今天這篇寫起來就順暢多了。哦,極度的舒適!

開門見山地說吧。大學里的計算機課程通常專注于講授計算機操作系統(tǒng)、計算機組成原理、計算機網(wǎng)絡等學院派的課程,以及某一門具體的編程語言,比如說 Java、C++/C,而對于如何精通工具這個主題往往不在講授的課程之內,需要同學們自行摸索。

但實際上呢,某些工具的使用頻率高到可以使用一個成語來形容——朝夕相伴。比如說命令行,不僅在學生時代經常用到,工作后更是形影不離。因此,花一些時間來打磨使用這些工具的能力就變得迫在眉睫。比如說今天的主角——命令行 Shell,項目的運維基本上都是通過 Shell 完成的。

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

01、再說 Shell 是什么

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

為了能充分地利用計算機的能力,我們有時候不得不回到最原始的交互方式——文字接口:Shell,一個用 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)

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

可通過 cat /etc/shells 命令來顯示本機上的 Shell。我用的 Mac,上面有 bash、csh、ksh、sh、tcsh、zsh 等等。

默認是 zsh,在窗口標題上可以看得出來。如果想切換到另外一種 Shell,可以直接敲 Shell 的名字,比如 tcsh,見下圖。

害,一不小心還是暴露了自己的名字。如果想退出當前 Shell 到默認 Shell 的話,敲 exit 命令就可以了。

02、初用 Shell

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

先從窗口標題說起,重點是 zsh。

2019 年,Apple 發(fā)布了新一代 macOS——macOS Catalina,為專業(yè)用戶帶來了一項重大變化,zsh 取代了 bash,成為默認的 Shell。相比 bash,zsh 擁有更強大的功能,比如說更智能的自動補全、更豐富的主題等等。這逼絕對是馬車中的跑車,跑車中的飛行車,史稱「終極 Shell」。

再說說窗體內容。

第一行內容顯示了最近一次的登錄時間。有些同學會好奇,“ttys000”是什么鬼?

簡單來說,tty 是終端的統(tǒng)稱??催^「終于制服了它們」的同學應該知道了,早期的終端是電傳字打印機(Teletype / Teletypewriter),英文縮寫就是 tty。雖然終端設備已經不再限制于電傳打字機了,但是 tty 這個名稱還是就這么保留了下來。

“ttys000” 就是 tty 加了一個代號 s000。

第二行內容告訴我們,主機名是 itwanger??赏ㄟ^「系統(tǒng)偏好設置」→「共享」→「電腦名稱」→「編輯」修改主機名。% 后面跟了一個提示符,可以在此輸入任意字符,只不過有些可以被 Shell 解析,有些則不能。

03、Oh My Zsh

zsh 本身非常強大,但配置復雜,對普通用來來說體驗非常差。直到有一天,有個無聊的家伙開發(fā)出了一個能夠快速配置 zsh 的項目,叫做「Oh My Zsh」,GitHub 地址如下所示:

https://github.com/ohmyzsh/ohmyzsh

這玩意安裝起來極為簡單,能夠讓我們神功速成,有點「五分鐘學會 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

由于某些原因,速度可能會比較慢,耐心地等待一會。

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

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

vim ~/.zshrc

可以看到,Oh My Zsh 默認使用的主題是 robbyrussell,可在 ~/.oh-my-zsh/themes 目錄下找到更多主題進行切換。

如果你不知道選擇哪個主題,可以通過下面的網(wǎng)址進行預覽。

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

如果你有選擇困難癥,可以像我一樣,配置成隨機,每新開一次窗口,Oh My Zsh 就替你選一次。

ZSH_THEME="random"

現(xiàn)在,就新開一個窗口吧,可以看到主題隨機到了 essembeh。

再來說說插件。Oh My Zsh 提供了完善的插件體系,默認有 100 多種,可以在 ~/.oh-my-zsh/plugins 目錄下找到這些插件。如果不確定這些插件是干嘛的,可以查看一下插件目錄下對應的 README.md 文件。插件的配置同樣在 .zshrc 文件里,目前默認的插件只有 git。

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

04、再用 Shell

來執(zhí)行一個最簡單的命令 date,不出意外的話,它將會打印出當前的日期和時間。

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

echo hello

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

echo "hello world"

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

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

Shell 中的路徑是一組被分割的目錄,在 Linux 和 macOS 上使用的 / 分割,在 Windows 上是 \,正因為這樣,我們在編程的時候一定要先獲取系統(tǒng)的分隔符(Java 是 File.separator 獲取的),不然會導致程序在不同的操作系統(tǒng)下無法執(zhí)行!

如果某個路徑以 / 開頭,那么它就是一個絕對路徑,其他都是相對路徑。當前工作目錄可以通過 pwd 命令來獲取,切換目錄通過 cd 命令。. 表示的是當前目錄,.. 表示上級目錄。

Shell 會實時顯示當前的路徑信息??梢酝ㄟ^ ls 命令查看當前目錄下包含哪些文件,安裝了 Oh My Zsh 后,還可以通過 ll(其實是 ls -l 的簡寫)顯示文件或者文件夾的詳細信息。

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

  • d:第 1 位表示文件類型,d 是目錄、l 是鏈接文件、- 是普通文件。
  • rwx:第 2-4 位表示這個文件的所有者擁有的權限,r 是讀、w 是寫、x 是執(zhí)行。
  • r-x:第 5-7 位表示和這個文件的所有者所在同一個組的用戶具有的權限。
  • r-x:第 8-10 位表示其他用戶所具有的權限。

比如:

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

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

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

man ls

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

在 Shell 中,程序主要有兩個流:輸入流和輸出流。當程序嘗試讀取信息時,就從輸入流中讀?。划敵绦驀L試打印信息時,就將信息輸出到輸出流中。通常來說,鍵盤作為輸入設備,顯示器作為輸出設備。

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

?  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 程序員來說,我們通常需要在運行環(huán)境上這樣運行 jar 文件。& 代表在后臺運行。

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

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

Unix 于 1969 年由貝爾實驗室開發(fā),目前主流的 Unix 系統(tǒng)有三種,分別是 AIX、HP-UX、Solaris,互不兼容。Linux 于 1991 年由芬蘭大學生 Linus 開發(fā),是一個類 Unix 系統(tǒng),但是其代碼不源自任何 Unix 版本,完全不是 Unix 的一個分支。

通常來說,我們并不會用 root 用戶直接登錄系統(tǒng),因為這樣可能會因為某些錯誤破壞系統(tǒng)。所以在需要的時候,我們會使用 sudo 命令,也就是以 su(super user)的身份去執(zhí)行一些操作。

當你遇到 permission denied(拒絕訪問)的錯誤時,通常是因為需要是 root 用戶才能操作的原因引起的。get 了吧?

學到這,你掌握的 Shell 知識已經可以完成一些基礎的任務了。有云服務器的同學,或者安裝了虛擬機的同學,可以在上面建個臨時文件夾練習下文中提到的命令。

最后,希望同學們都能把 Shell 用好,工作后會大有幫助的!覺得不錯的話,歡迎一鍵三連,做個帥氣美麗的三連人。


推薦閱讀:

V4.0 《JavaGuide 面試突擊版》來啦!GitHub 上標星 98.1k,幫你成功上岸!

奉勸那些想把編程學好的學弟學妹們

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 背景工欲善其事必先利其器,聽說zsh很強大,完全兼容bash,so決定一試一試。(其實是搞動態(tài)規(guī)劃代碼搞得頭皮發(fā)麻...
    計算機工程制圖閱讀 2,751評論 1 1
  • 有些同學可能對Shell不太熟悉。借用池建強的一個解釋:簡單的說,Shell是Linux/Unix的一個外殼。它負...
    lingyv閱讀 9,378評論 1 21
  • █████╗ ██╗ ██╗███████╗███████╗ ██████╗ ███╗ ███╗████...
    若與閱讀 5,732評論 0 18
  • 一、iTerm2簡介:(轉載) Mac OS自帶的終端,用起來雖然有些不太方便,界面也不夠友好,iTerm2是一款...
    王小帥_94閱讀 1,682評論 0 1
  • 1.簡介 Mac OS自帶的終端,用起來雖然有些不太方便,界面也不夠友好。iTerm2是一款相對比較好用的終端工具...
    IAM121閱讀 52,550評論 1 15

友情鏈接更多精彩內容