認識終端和shell

Chase_Tsai發表於2024-07-07

【教程】在macOS上用VSCode寫C++程式碼 4 認識終端和shell

內建程式與內建命令

開啟終端,其實相當於開啟了shell。shell 可以執行一些程式(例如 sayhello/bin/mkdir )。

shell自身也帶著一些程式(二進位制可執行檔案),這些程式就叫內建程式。

特點:呼叫shell內建程式的時候只需要敲一個單詞就行了。一個單詞很短,所以把它們稱作內建命令。

重要內建命令:which, echo, history, pwd, cd

Ps. 系統自帶的程式如果也能用一個單詞就呼叫那麼也可以稱它們為系統命令

與路徑無關

which

檢視shell如何解釋後面的命令

which which
which echo
which history
which pwd
which cd

得到結果:which: shell built-in command

認識終端和shell
which /bin/date

得到結果:/bin/date 即一個二進位制可執行檔案

echo

將後面輸入的東西返回。在顯示變數的時候會顯示變數的值而不是那個字串

認識終端和shell

樣例解釋:

echo $SHELL

檢視正在使用的 shell ,此時就是bin目錄下的zsh程式。還有其他 shell,但是 macOS 預設的 shellzsh

history

顯示輸入命令的歷史

可以帶引數,表示最近幾次

history
history -3

date

輸入:

which date
which /bin/date

發現都返回 /bin/date ,說明shell用同種方式解析二者。

所以直接輸入 dateshell 就會幫我解析這個單詞,然後去呼叫在檔案系統中的 /bin/date 這一個二進位制程式,執行這個程式,然後返回當前的時間。

與shell當前工作目錄相關

pwd

% 前的 ~ 表示當前所在的目錄,用 pwd 可以返回shell當前所在的工作目錄,即 ~

認識終端和shell

檔案的絕對路徑和相對路徑

絕對路徑:從根目錄開始

相對路徑:. 當前路徑;.. 當前路徑的上一級路徑,即返回上一級資料夾;... 上級的上級;- 剛剛在的目錄;~ 家目錄

絕對路徑和相對路徑詳解

cd

跳轉 shell 的當前工作目錄到指定的目錄,引數不區分大小寫

認識終端和shell

想回到上一層目錄?用相對路徑 cd ..

% 前是當前目錄

shell常用命令

參考2020年清華大學電子系科協暑培|Linux

ls

列出當前資料夾下的所有檔案,可有引數

ls
ls -a		#顯示隱藏檔案		
ls -l		

cat

開啟檔案,顯示檔案的內容

cat hello.txt

clear

清空終端中存在的已經執行過的命令( history 仍然可以檢視)

mkdir

在當前目錄下建立資料夾

touch

在當前目錄下建立檔案(一般是文字檔案)

touch test.md
touch t		#沒有字尾名的文字檔案,可透過文字編輯開啟,就是之前想要的純文字!
認識終端和shell

rm

rm test.md		#移除某個檔案(不是移動到廢紙簍,而是直接抹掉!!!)
rm -d newFolder		#移除某個資料夾
rm -rf newFolder		#強制刪除(使用一定慎重!!!)

Ps. 輸入過程中點 tab 可以自動補全帶字尾的檔名

mv/cp

移動檔案與複製檔案

移動檔案到原地相當於重新命名

mv final.c C_Xcode		#把final.c移動到C_Xcode資料夾中
mv newFolder/final.c newFolder/ffff.c 		#重新命名

man

檢視命令的幫助文件

man date
認識終端和shell

Q 退出

open

open foo.md
open -a Visual\ Studio\ Code.app foo.md 	
open $(pwd)
open .

-a 引數指定開啟程式(需要使用程式全名)

$(pwd) 表示當前目錄,open $(pwd) 表示用 Finder 開啟 shell 當前的工作目錄 ( open . 也可)

shell常用的操作

輸出流重定向

echo "hello world" > my.txt
echo "hhhh" > my.txt					#發現檔案內容只有hhhh,因為 > 表示覆蓋
echo "hahaha" >> my.txt				# >> 實現追加

預設的輸出是螢幕顯示,現在重定向,不在終端中顯示,而是直接寫到my.txt檔案中去

管道

| :上一個命令(程式)的輸出作為下一個命令的輸入

history -100 | grep "mkdir"		#最近100條中有哪些是帶有mkdir的

grep相當於搜尋,從給他的字串中搜尋帶有關鍵詞的行

⌃C

輸入有誤時,停止當前輸入,退出

this is wrong

此時點 ⌃C ,可以不執行此行,重開一行

空格

shell透過空格來分辨命令與引數

如果引數中有空格,需要 \ (轉義空格)或 "" (給引數加引號)

終端進階與常用的終端操作

where

where 也是一個 shell 內建命令,和 which 的功能差不多,告訴我們一個命令如何被 shell 解析。

區別:where 能夠告訴我們 shell 去解析這個命令的全部可能性,whichwhere 的第一行

vim極簡入門

可以編輯文字

vim my.txt

i 進入編輯模式

退出插入模式並儲存:⎋ > : > wq

Ps. ⎋是 esc

⌃D

⌃C 差不多,都是退出當前

chmod

修改檔案許可權

chmod a+x <filepath> 	#使一個檔案有可執行許可權

環境變數

shell 認識給它的命令(單詞),所以它就用這個命令(單詞)找到需要執行的程式,然後執行這個程式。那 shell 是怎麼認識我們給它的單詞呢???

檢視環境變數:

echo $PATH

返回:

認識終端和shell

其中冒號是分隔符。當給 shell 扔了一個命令之後,shell 先在自己的內建程式中找有沒有這個單詞,沒找到再到環境變數去找。

其他的工具

shell指令碼--組合你的命令

shell指令碼:就是把許多命令組合起來,完成一項任務

homebrew--macOS快速安裝命令列程式

brew官網

zsh配置檔案

想要在終端執行自己寫的程式,需要給出路徑。如果直接 % sayhello ,會得到 zsh: command not found: sayhello。如何讓shell認識我們的單詞 sayhello

先退回家目錄 ~

open ~/.zshrc 		#返回The file /Users/chasetsai/.zshrc does not exist.說明沒有這個檔案
touch ~/.zshrc		#建立一個
echo "alias sayhello=~/desktop/sayhello" > ~/.zshrc		#設定別名
source .zshrc			#使該檔案生效

此時我們直接輸入 sayhello 就能得到預期輸出!!!

檢視所有的shell內建命令

man builtins 可以檢視shell的所有內建命令

man zshbuiltins 可以檢視zsh的所有內建命令

相關文章