Command Line 超新手入門


Posted by saffran on 2020-12-01

Command Line 是什麼、環境設置

Command Line 其實就是「另一種操縱電腦的方式」

操縱電腦的方法,可以分為兩種類型

  1. 圖形化的介面(Graphical User Interface,簡稱 GUI),例如:檔案總管,我可以用滑鼠點擊選單、按鈕的方式來操縱電腦幫我做「新增資料夾、更改檔案名稱...」的動作

  2. 文字指令行介面(Command Line Interface,簡稱 CLI):透過「純文字」來操縱電腦

    # 環境設置

zsh 是什麼?

以下內容整理自 客製我的 CLI - 終於稍微搞懂 iTerm + ZSH

首先要先了解,shell 這個東西是什麼?

我們的作業系統在電腦上運作時,人類需要有個介面來對作業系統的核心下達指令,以前還沒有什麼 GUI 介面的時候,就是透過終端機這種文字介面 ( command line interface ) 來跟電腦溝通。

負責這個溝通的文字介面程式就叫做 shell。(也就是說,shell 是一種程式語言)

shell 這種程式語言可以執行幾種程式:

  1. bash:像是 mac os 或 linux 這種師出同源的 *nix-based 作業系統,預設的 shell 程式都是 bash
  2. zsh:可以自行把這個預設的 bash 換成 z shell(也就是 zsh)

當我們開啟新的 terminal 分頁或視窗,就會開始執行 bash 或 zsh 這些 shell 程式

在 markdown 標註 shell 語言的方式

在 code block 區塊標註的是語言,因此如果想要標示 shell 語言的 code syntax 的話,有兩種方式

  1. 標註 sh,是 shell 語言的簡寫
    例如:
    git branch week1
    
  2. 標註 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

用途:

  1. 列出所有檔案(包括隱藏檔案),像是 ....DS_Store 這些
  2. 以詳細的方式列出檔案
    以下紅色框框分別代表:
  • 檔案權限
  • 檔案擁有者
  • 檔案大小
  • 最後修改日期、時間

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 的開頭字母)
  • 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 (離開)

或者是,也可以這樣:

  1. 先輸入:w Enter 來儲存檔案
  2. 再輸入: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 圖片,我想要把它下載下來,除了用「另存圖片」的方式之外,還可以這樣做:

  1. 在圖片按右鍵,點選 Copy Image Address
  2. 輸入指令 wget 圖片網址 (剛剛複製下來的圖片網址),就可以把圖片下載下來了
  3. 輸入指令 open 圖片檔名 來打開圖片

下載網頁的原始碼

例如:
我現在想要把 google 首頁的原始碼下載下來

  1. 輸入指令 wget https://google.com
  2. 在資料夾中就可以看到一個 index.html 的檔案
  3. 輸入指令 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 介面上,但是,我現在想要把結果輸出成「一個檔案」,作法如下:

  1. 輸入指令 echo 'tuesday' > week.txt,意思是說「我要把echo 'tuesday'的結果,輸出到week.txt檔案裡面」
  2. ls就可以看到,多出了一個week.txt檔案
  3. 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

延續上方的範例:

  1. 我想把grep a的結果存成一個檔案,因此使用指令cat hello.txt | grep a > result
  2. 就會多出一個檔案叫做result
  3. 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

參考資料:[指令] Command Line 操作, cmd, cli, bash


#command line







Related Posts

DAY34:Product of consecutive Fib numbers

DAY34:Product of consecutive Fib numbers

OncePerRequestFilter

OncePerRequestFilter

2/2 Java Full Stack GenSpark

2/2 Java Full Stack GenSpark


Comments