同學們好,今天二哥是來補課的。
上一篇「終於制服了它們」把命令行、終端、Shell 搞清楚後,今天這篇寫起來就順暢多了。哦,極度的舒適!
開門見山地說吧。大學裡的計算機課程通常專注於講授計算機作業系統、計算機組成原理、計算機網絡等學院派的課程,以及某一門具體的程式語言,比如說 Java、C++/C,而對於如何精通工具這個主題往往不在講授的課程之內,需要同學們自行摸索。
但實際上呢,某些工具的使用頻率高到可以使用一個成語來形容——朝夕相伴。比如說命令行,不僅在學生時代經常用到,工作後更是形影不離。因此,花一些時間來打磨使用這些工具的能力就變得迫在眉睫。比如說今天的主角——命令行 Shell,項目的運維基本上都是通過 Shell 完成的。
記得剛參加工作那會,需要向一名前輩請教線上部署的問題。我站在他的身後,看著他靈巧地手指在鍵盤上熟練地操作著,黑色的 XShell 窗口裡,彩色的字符在愉快地跳躍著,有一種杰倫在鋼琴上彈奏《逆鱗狂想曲》的感覺,特別崇拜。
01、再說 Shell 是什麼現代計算機的交互接口多種多樣,從常見的圖形化界面,到語音輸入,再到 AR 和 VR,都可以滿足指令的輸入。這些接口可以覆蓋絕大多數的應用場景,但它們從根本上限制了另外一種操作方式——你不能點擊一個不存在的按鈕,或者使用語音輸入一個還沒錄入的指令。
為了能充分地利用計算機的能力,我們有時候不得不回到最原始的交互方式——文字接口:Shell,一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。
幾乎所有的作業系統都支持某種形式的命令行 Shell,有些甚至提供了多種 Shell 可供選擇。Linux 上常見的 Shell 有:
Bourne Shell(/usr/bin/sh 或 /bin/sh)Bourne Again Shell(/bin/bash)雖然細節上有些許差異,但核心功能是一樣的:允許你執行程序,輸入指令並獲取某種半結構化的輸出。
可通過 cat /etc/shells 命令來顯示本機上的 Shell。我用的 Mac,上面有 bash、csh、ksh、sh、tcsh、zsh 等等。
默認是 zsh,在窗口標題上可以看得出來。如果想切換到另外一種 Shell,可以直接敲 Shell 的名字,比如 tcsh,見下圖。
害,一不小心還是暴露了自己的名字。如果想退出當前 Shell 到默認 Shell 的話,敲 exit 命令就可以了。
02、初用 Shell在啟動臺找到「終端」,打開(我用的 Mac),如下圖所示。
先從窗口標題說起,重點是 zsh。
2019 年,Apple 發布了新一代 macOS——macOS Catalina,為專業用戶帶來了一項重大變化,zsh 取代了 bash,成為默認的 Shell。相比 bash,zsh 擁有更強大的功能,比如說更智能的自動補全、更豐富的主題等等。這逼絕對是馬車中的跑車,跑車中的飛行車,史稱「終極 Shell」。
再說說窗體內容。
第一行內容顯示了最近一次的登錄時間。有些同學會好奇,「ttys000」是什麼鬼?
簡單來說,tty 是終端的統稱。看過「終於制服了它們」的同學應該知道了,早期的終端是電傳字印表機(Teletype / Teletypewriter),英文縮寫就是 tty。雖然終端設備已經不再限制於電傳打字機了,但是 tty 這個名稱還是就這麼保留了下來。
「ttys000」 就是 tty 加了一個代號 s000。
第二行內容告訴我們,主機名是 itwanger。可通過「系統偏好設置」→「共享」→「電腦名稱」→「編輯」修改主機名。% 後面跟了一個提示符,可以在此輸入任意字符,只不過有些可以被 Shell 解析,有些則不能。
03、Oh My Zshzsh 本身非常強大,但配置複雜,對普通用來來說體驗非常差。直到有一天,有個無聊的傢伙開發出了一個能夠快速配置 zsh 的項目,叫做「Oh My Zsh」,GitHub 地址如下所示:
https://github.com/ohmyzsh/ohmyzsh
這玩意安裝起來極為簡單,能夠讓我們神功速成,有點「五分鐘學會 XXX」的味道。
直接在終端裡執行 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 目錄下找到更多主題進行切換。
如果你不知道選擇哪個主題,可以通過下面的網址進行預覽。
https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes
如果你有選擇困難症,可以像我一樣,配置成隨機,每新開一次窗口,Oh My Zsh 就替你選一次。
ZSH_THEME="random"現在,就新開一個窗口吧,可以看到主題隨機到了 essembeh。
再來說說插件。Oh My Zsh 提供了完善的插件體系,默認有 100 多種,可以在 ~/.oh-my-zsh/plugins 目錄下找到這些插件。如果不確定這些插件是幹嘛的,可以查看一下插件目錄下對應的 README.md 文件。插件的配置同樣在 .zshrc 文件裡,目前默認的插件只有 git。
到此為止,Oh My Zsh 的安裝、配置、插件完成了三位一體,終極 Shell 全面登場。
04、再用 Shell來執行一個最簡單的命令 date,不出意外的話,它將會列印出當前的日期和時間。
然後,光標等待我們輸入其他命令,我們可以在執行命令的時候帶上參數。
echo helloecho 命令會將參數 hello 列印出來,Shell 是基於空格分隔命令進行解析的,第一個單詞代表可執行的程序,後續的單詞作為傳遞給程序的參數。如果你希望參數裡包含空格的話,可以使用單引號或者雙引號包裹起來。
echo "hello world"當我們在 Shell 中執行命令時,實際上是在執行一段 Shell 可以解釋執行的簡單代碼。如果命令不是 Shell 的預知範圍之內的話,它會去諮詢環境變量 $PATH。
可以使用 which 命令來確定某個程序名代表的是哪個具體的程序。也可以繞過 $PATH,直接使用帶路徑的命令來執行,比如 /bin/date。
Shell 中的路徑是一組被分割的目錄,在 Linux 和 macOS 上使用的 / 分割,在 Windows 上是 \,正因為這樣,我們在編程的時候一定要先獲取系統的分隔符(Java 是 File.separator 獲取的),不然會導致程序在不同的作業系統下無法執行!
如果某個路徑以 / 開頭,那麼它就是一個絕對路徑,其他都是相對路徑。當前工作目錄可以通過 pwd 命令來獲取,切換目錄通過 cd 命令。. 表示的是當前目錄,.. 表示上級目錄。
Shell 會實時顯示當前的路徑信息。可以通過 ls 命令查看當前目錄下包含哪些文件,安裝了 Oh My Zsh 後,還可以通過 ll(其實是 ls -l 的簡寫)顯示文件或者文件夾的詳細信息。
簡單來介紹一下文件屬性,以後會很有用。
d:第 1 位表示文件類型,d 是目錄、l 是連結文件、- 是普通文件。rwx:第 2-4 位表示這個文件的所有者擁有的權限,r 是讀、w 是寫、x 是執行。r-x:第 5-7 位表示和這個文件的所有者所在同一個組的用戶具有的權限。r-x:第 8-10 位表示其他用戶所具有的權限。比如:
-rw-r--r-- 1 maweiqing staff 6B 1 12 16:35 hello.txt表示 hello.txt 是個普通文件,maweiqing 擁有讀和寫的權限,但沒有執行的權限,和 maweiqing 所在的同一個 staff 組的用戶擁有隻讀權限,剩餘用戶同樣。
如果你想要知道命令的參數、輸入輸出信息,或者是想要了解它們的工作方式,可以試試 man 這個命令。它會接受一個程序名作為參數,然後將它的文檔(用戶手冊)展現出來。
man ls可以按 q 鍵退出用戶手冊。你可以趁機學習一下 mv(用於重命名或移動文件)、 cp(拷貝文件)以及 mkdir(新建文件夾)這些常用命令。注意,rm (刪除文件)這個命令一定要慎用啊,搞不好就是刪庫跑路的節奏!
在 Shell 中,程序主要有兩個流:輸入流和輸出流。當程序嘗試讀取信息時,就從輸入流中讀取;當程序嘗試列印信息時,就將信息輸出到輸出流中。通常來說,鍵盤作為輸入設備,顯示器作為輸出設備。
可以使用 < 和 > 來重定向輸入輸出流。使用 >> 將輸出以追加的方式重定向到文件。
➜ 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 程式設計師來說,我們通常需要在運行環境上這樣運行 jar 文件。& 代表在後臺運行。
nohup java -jar XXX.jar > out.log &對於絕大多數的類 Unix 系統,有一類用戶非常特殊,就是 root 用戶,可以創建、讀取、更新和刪除系統中的任何文件。
Unix 於 1969 年由貝爾實驗室開發,目前主流的 Unix 系統有三種,分別是 AIX、HP-UX、Solaris,互不兼容。Linux 於 1991 年由芬蘭大學生 Linus 開發,是一個類 Unix 系統,但是其代碼不源自任何 Unix 版本,完全不是 Unix 的一個分支。
通常來說,我們並不會用 root 用戶直接登錄系統,因為這樣可能會因為某些錯誤破壞系統。所以在需要的時候,我們會使用 sudo 命令,也就是以 su(super user)的身份去執行一些操作。
當你遇到 permission denied(拒絕訪問)的錯誤時,通常是因為需要是 root 用戶才能操作的原因引起的。get 了吧?
學到這,你掌握的 Shell 知識已經可以完成一些基礎的任務了。有雲伺服器的同學,或者安裝了虛擬機的同學,可以在上面建個臨時文件夾練習下文中提到的命令。
好啦,以上就是今天的分享啦,覺得不錯的話,不要吝嗇你的點讚和在看喲~
參考連結:https://missing-semester-cn.github.io/2020/course-shell
溫馨提醒:記得把「沉默王二」加個星標啊,這樣就不會錯過更新啦~