Command Line 是什麼、環境設置
Command Line 其實就是「另一種操縱電腦的方式」
操縱電腦的方法,可以分為兩種類型
圖形化的介面(Graphical User Interface,簡稱 GUI),例如:檔案總管,我可以用滑鼠點擊選單、按鈕的方式來操縱電腦幫我做「新增資料夾、更改檔案名稱...」的動作
文字指令行介面(Command Line Interface,簡稱 CLI):透過「純文字」來操縱電腦
# 環境設置
- 介紹好用工具:Cmder ( 具有 Linux 溫度的 Windows 命令提示字元工具 )
- [心得] iTerm2 + zsh,打造更好的工作環境
- 超簡單!十分鐘打造漂亮又好用的 zsh command line 環境
zsh 是什麼?
以下內容整理自 客製我的 CLI - 終於稍微搞懂 iTerm + ZSH
首先要先了解,shell 這個東西是什麼?
我們的作業系統在電腦上運作時,人類需要有個介面來對作業系統的核心下達指令,以前還沒有什麼 GUI 介面的時候,就是透過終端機這種文字介面 ( command line interface ) 來跟電腦溝通。
負責這個溝通的文字介面程式就叫做 shell。(也就是說,shell 是一種程式語言)
shell 這種程式語言可以執行幾種程式:
bash
:像是 mac os 或 linux 這種師出同源的 *nix-based 作業系統,預設的 shell 程式都是 bashzsh
:可以自行把這個預設的 bash 換成 z shell(也就是 zsh)
當我們開啟新的 terminal 分頁或視窗,就會開始執行 bash 或 zsh 這些 shell 程式
在 markdown 標註 shell 語言的方式
在 code block 區塊標註的是語言,因此如果想要標示 shell 語言的 code syntax 的話,有兩種方式
- 標註
sh
,是 shell 語言的簡寫
例如:git branch week1
- 標註
zsh
,因為 zsh 也同時是一種腳本語言
例如:git branch week1
參考資料 github Highlight 列表
Command Line 好用指令
在 Command Line 中,可以使用「絕對路徑」或是「相對路徑」來切換檔案位置
絕對路徑
以/
開頭的,就是絕對路徑,代表一個「絕對的位置」
例如:~/Desktop/test
最前面的 ~
代表的是「自己電腦上的家目錄」這一段絕對路徑的縮寫(也就是 /Users/saffran
這個資料夾),因為它不受相對位置影響,所以是屬於絕對路徑。
參考文章 shell - Is ~/Documents a relative or an absolute path? - Unix & Linux Stack Exchange
相對路徑
相對於現在的資料夾
例如:
在 test
資料夾 底下有一個 image
資料夾
我現在所在的資料夾是~/Desktop/test
,因此,我只要輸入cd image
,就可以跳到「在 test
資料夾 底下的 image
資料夾」
但是,如果我輸入的指令是 cd /image
,就會出現錯誤「no such file or directory: /image」,是因為/
代表「根目錄」,而在根目錄中,並沒有image
資料夾
基本指令
執行每一個指令,其實就是在執行一個「程式」
pwd
印出目前所在位置
print working directory 的簡寫
ls
列出檔案清單
list 的簡寫--> 印出現在資料夾底下的檔案
加參數
在 ls
後面加上 -
就代表「我要加上參數」
ls -al
用途:
- 列出所有檔案(包括隱藏檔案),像是
.
、..
、.DS_Store
這些 - 以詳細的方式列出檔案
以下紅色框框分別代表:
- 檔案權限
- 檔案擁有者
- 檔案大小
- 最後修改日期、時間
cd
切換資料夾
change directory 的簡寫
cd ..
回到上一層
cd ~
回到/Users/saffran
資料夾
~
就是代表 /Users/saffran
這個資料夾,也就是「家目錄」 (~
是絕對路徑)
注意!~
的位置會因系統而異,也可以自己設定位置
man
指令使用手冊
manual 的縮寫--> 使用說明書
在 man
後面接上「我要查詢的指令名稱」
例如:
man ls
就可以看到關於ls
的使用說明手冊
指令可以加上哪些參數?
下面這行所列出的,就是ls
後面可以加上的參數
SYNOPSIS
ls [-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1%] [file ...]
下面會仔細介紹各個參數的用途
例如:
ls -a
代表:列出所有檔案(包括隱藏的檔案)a
就是取 all 的開頭字母- Include directory entries whose names begin with a dot (
.
) - 檔案名稱最前方有一個
.
的通常都是「隱藏檔案」
ls -l
代表:以詳細的方式列出檔案- List in long format. (
l
就是取 long 的開頭字母)
- List in long format. (
ls -al
代表:以詳細的方式列出所有檔案(包括隱藏的檔案)
### 按下q
可離開手冊畫面
檔案操作相關指令
touch
更改檔案時間&建立檔案
更改檔案時間
當我 touch(碰一下)檔案,就更改了檔案最後修改的時間(檔案內容並不會被改變)
建立檔案
當我 touch 了一個「不存在的檔案」,就會直接幫我建立這個檔案
rm
刪除
remove 的簡寫
刪除檔案: rm 檔案名稱
例如:
rm index.html
就可以把 index.html 刪除掉
rm -f 檔案名稱
強制刪除
有些受到保護的檔案,在被刪除之前,會詢問你「是否確定要刪除」
如果指令加上-f
,就會直接刪除,不會出現「是否確定要刪除」的提示
-f
這個參數比較危險,因為有些重要的檔案,刪掉就救不回來了
刪除資料夾
當資料夾是「空的」時: rmdir 資料夾名稱
例如:
當 image 資料夾是「空的」時,
就可以使用 rmdir image
把 image 資料夾刪除掉
(dir 就是 directory 的簡寫)
當資料夾「不是空的」時: rm -r 資料夾名稱
例如:
當 image 資料夾裡面不是空的,
就只能使用 rm -r image
把 image 資料夾刪除掉
在這裡,-r
跟-R
是一樣的
-r
會把「這個資料夾 & 資料夾底下的全部檔案」都刪除,也就是「刪除資料夾的意思」
mkdir
建立資料夾
make directory 的簡寫
mv
移動檔案 or 改名
move 的簡寫
移到資料夾裡面: mv 檔案名稱 資料夾名稱
例如:
輸入指令 mv hello.txt image
就可以把「hello.txt
檔案」移到「image
資料夾」裡面
再從資料夾拿出來: mv 檔案名稱 ..
例如:
現在,在image
資料夾裡面,有一個hello.txt
檔案
注意!
要先移動到「image
資料夾」,才可以輸入指令 mv hello.txt ..
就可以把「hello.txt
檔案」移出「image
資料夾」到上一層去
檔案改名: mv 檔案舊名稱 檔案新名稱
例如:
輸入指令 mv hello.txt apple
,就可以把hello.txt
改名為apple
可以想成是:我把hello.txt
檔案移動到apple
檔案去
cp
複製
copy 的簡寫
複製檔案: cp 檔案名稱 複製的檔案名稱
例如:
輸入指令 cp hello.txt hello2.txt
,就可以把原本的 hello.txt
檔案,複製一份且取名叫做 hello2.txt
複製資料夾: cp -r 資料夾名稱 複製的資料夾名稱
例如:
輸入指令 cp -r image image2
,就可以把原本的 image
資料夾,複製一個且取名叫做 image2
資料夾
vim 基本使用教學
vim 是一個文字編輯器
vim 是「Vi iMproved」--> 比 vi 更多功能的版本
vim 使用時機
例如:當我連上一個 server,server 不會有文字編輯器(像是 sublime, vs code)的軟體可以使用,就可以直接使用 vim 來做文字編輯
vim 檔案名稱
在vim
後面接上我想編輯的檔案名稱,就會進入一個文字編輯器
例如:
輸入指令 vim hello.txt
按i
進入 insert 模式
進入 vim 之後,要按下i
進入 insert 模式,才可以輸入文字
按esc
回到普通模式
回到普通模式
- 可以:刪除、複製、貼上
- 不可以:輸入文字
## 按:q
離開 vim
要離開 vim,就要先回到普通模式,然後可以有幾種離開的方式:
[方式一] save and then quit vim 的指令是 :wq
Enter
w
代表 write (寫入檔案,也就是“儲存”的意思)q
代表 quit (離開)
或者是,也可以這樣:
- 先輸入
:w
Enter 來儲存檔案 - 再輸入
:q
Enter 來離開 vim
[方式二] quit without saving any changes 的指令是 :q!
Enter
注意!不能只輸入:q
Enter 來離開 vim
如果只輸入:q
Enter,會出現錯誤訊息「No write since last change」
原因為:
這個錯誤訊息 "No write since last change" 的意思是-->
你還沒有儲存你的檔案
(這裡的“write”就是“儲存檔案”的意思)
cat
連接檔案、查看檔案內容
cat
主要是用來連接兩個檔案,但是如果只有放一個參數(一個檔案),就會把該檔案的內容列印出來,因此這也是一個可以快速查看檔案內容的方式
例如:輸入指令 cat hello.txt
其他好用指令
grep
抓取關鍵字
例如:
我在 hello.txt 檔案中輸入了這些文字
saffran➜~/Desktop/test» cat hello.txt [21:58:57]
sunny
windy
hola hola hola
december
grep 關鍵字 檔案名稱
我想要知道是否有出現「a」這個字母,
可以輸入指令 grep a hello.txt
,就會幫我在 hello.txt 檔案中,抓出有出現「a」的那行,並且把「a」標示成紅色
saffran➜~/Desktop/test» grep a hello.txt [22:00:23]
hola hola hola
wget
下載檔案
下載圖片
例如:
我在瀏覽網站時,看到一張 logo 圖片,我想要把它下載下來,除了用「另存圖片」的方式之外,還可以這樣做:
- 在圖片按右鍵,點選 Copy Image Address
- 輸入指令
wget 圖片網址
(剛剛複製下來的圖片網址),就可以把圖片下載下來了 - 輸入指令
open 圖片檔名
來打開圖片
下載網頁的原始碼
例如:
我現在想要把 google 首頁的原始碼下載下來
- 輸入指令
wget https://google.com
- 在資料夾中就可以看到一個 index.html 的檔案
- 輸入指令
cat index.html
來查看原始碼的內容
curl
送出 request
curl
可以用來測試 api
curl api網址
在curl
後面接上一個 api 網址,就會用get
的方法送出 request,然後把 response 顯示出來
curl -I api網址
如果我想要擷取一些資訊(例如:header),就可以加上參數I
,然後就可以看到跟 HTTP 的 header 有關的資訊
指令的組合技:redirection 與 pipe
redirection
重新導向 input, output
把結果導向到其他檔案
例如:
當我使用ls -al
來印出所有檔案的詳細資訊,我希望印出來的資訊不要直接顯示在 CLI 的介面上,而是「保存成一個檔案」
這時,就可以輸入指令ls -al > list_result
>
的意思就是:我要把「ls -al
印出來的結果」輸出到「list_result
檔案」裡面
按下 Enter 後,就可以看到一個「list_result
檔案」
輸入指令 vim list_result
來看檔案內容,就會是剛剛ls -al
印出來的結果了:
把結果導向到其他指令
例如:
有一個指令叫做echo
,用途是「印出我輸入的內容」
- 當我想要印出字串,字串要不要用引號包起來都可以,例如:
輸入echo tuesday
,就會印出 tuesday - 當我想要印出“空白”,就需要用引號包起來,例如:
輸入echo ' '
,就會印出「一個空白」
echo
指令的結果,預設是會輸出在 CLI 介面上,但是,我現在想要把結果輸出成「一個檔案」,作法如下:
- 輸入指令
echo 'tuesday' > week.txt
,意思是說「我要把echo 'tuesday'
的結果,輸出到week.txt
檔案裡面」 - 用
ls
就可以看到,多出了一個week.txt
檔案 - 用
cat week.txt
來看檔案內容,就可以看到印出的 tuesday 了
>
會把舊的內容清空,再放入新的內容
如果只有使用一個箭頭>
,檔案原本的內容就會被全部蓋掉
延續上方的範例,現在在week.txt
檔案的內容是 tuesday
我再輸入指令 echo 'afternoon' > week.txt
,
然後用cat week.txt
來看檔案內容,會發現:
原本的內容 tuesday 會完全被蓋掉,只會有新的內容 afternoon
>>
會在舊的內容後方,新增新的內容
如果有使用兩個箭頭>>
(就是 append 的意思),舊的內容會被保留,再接著「新增」新的內容
延續上方的範例,現在在week.txt
檔案的內容是 afternoon
我再輸入指令 echo 'append to the end of the file' >> week.txt
,
然後用cat week.txt
來看檔案內容,會發現:
原本的內容 afternoon 會保留著,後面有新增的內容 append to the end of the file
pipe
結合多個指令
pipe
就是這個符號「|
」
pipe
可以把「左邊指令的輸出」當作「右邊指令的輸入」
例如:
pipe
結合 grep
使用指令cat hello.txt | grep a
意思就是:把「cat hello.txt
的輸出」當作「grep a
的輸入」
grep
就會從hello.txt
檔案內容中,抓出a
並標示出來
cat hello.txt
就是“輸出”(綠色框框)
下面這兩個指令其實是一樣的:
grep a hello.txt
在grep
後面接上兩個參數:「關鍵字+檔案名稱」cat hello.txt | grep a
因為這裡的grep a
後面沒有接「檔案名稱」,因此就會從其他地方去找輸入
pipe
結合 redirection
延續上方的範例:
- 我想把
grep a
的結果存成一個檔案,因此使用指令cat hello.txt | grep a > result
- 就會多出一個檔案叫做
result
- 用
cat result
來看檔案內容,就會是剛剛grep a
的結果
(抓出的關鍵字,只有在 CLI 介面上會被“上色”,因此如果是用cat result
來看檔案內容,關鍵字不會被上色)
讀取檔案
less <fileName>
使用 cat <fileName>
可以將檔案內容輸出在 CLI 介面上,
但是如果是使用 less <fileName>
就可以使用分頁的方式來顯示檔案內容
open -a [appToOpen] [fileName]
可以使用 open <fileName>
來開啟檔案,
如果是 open -a [appToOpen] [fileName]
就可以指定特定的應用程式來開啟檔案
找檔案
尋找空檔案
find . -empty
尋找名稱後綴為 .del 的資料夾
find . -iname '*.del' -type d
-type d
代表:type 是 directory
尋找名稱後綴為 .js 的檔案
find . -iname '*.js' -type f
-type f
代表:type 是 file
使用 &&
可以一次執行兩個指令
例如:
切換到「test 資料夾」,並且印出 code.js 的檔案內容
cd /Users/saffran/Desktop/test && cat code.js