軟體工程師需要了解的 Unix 指令 (1)
21 Nov 2015前言
由於最近在工作上越來越常用到各式各樣不同的 Unix 指令,只瞭解一些基本的 ls
, cd
等等已經不太夠用了,再加上之前看一些套件安裝文件或在 Stack Overflow 上看到某些問題解法時也不是很懂那些指令在做什麼。於是最近決定好好把 Unix 學一學並在這系列文章中將一些常用的指令與使用心得跟各位分享。
既然這是第一篇,我們還是從最基本的指令開始吧。由於 Unix 指令實在有太多的選項,本篇不會將他們一一列出來,只會針對幾個比較常用到的做說明。如有特殊需求要用到別的選項時,還是請各位自行到網路上或使用 man
指令做查詢。
本系列文章將使用 Mac OS X 來做操作,因此可能會有些地方與 Linux 不相同!
列出檔案與目錄 (ls)
我們第一個要來看的指令就是最常見大家也應該都很熟悉的 ls
。 由於 Unix 指令大多都是某個英文單字的縮寫,個人覺得了解背後代表的意義會比較容易清楚這個指令在做些什麼,所以都會自動腦補背後的單字。
像是 ls
就是 list (列出) 的縮寫,使用方法為:
> ls 檔案或目錄名稱
ls
能夠列出目錄下的內容,如果沒帶任何參數時會預設為目前所在目錄。
當參數為檔案時,會僅列出該檔案,我們可以運用這個特性來查看檔案有沒有存在某個目錄裡。
列出隱藏檔
在 ls
後面加入 -a
的選項後,可將隱藏檔也一併列出:
> ls -a 檔案或目錄名稱
縮寫的腦補:
-a: all (全部)
列出內容開頭是 .
的檔案大多都是隱藏檔喔。
列出詳細內容
當想顯示更多檔案資訊可在 ls
後面加入 -l
的選項:
> ls -l 檔案或目錄名稱
縮寫的腦補:
-l: long (更長的內容?)
讓我們來看看這個詳細內容長得如何吧,以下是範例:
-rw-r--r-- 1 Rhadow staff 0 11 21 12:52 test.js
drwxr-xr-x 2 Rhadow staff 68 11 21 12:52 testDir
以中間空白為區隔,我們可將上面的內容分為九列,他們分表代表著:
- 權限
- 連結 (連結到此檔案的 i-node,預知詳情請上網查詢)
- 檔案/目錄擁有者
- 檔案/目錄的群組
- 檔案大小 (單位為 bytes)
- 檔案/目錄建立月份
- 檔案/目錄建立日期
- 檔案/目錄建立時間
- 檔案/目錄名稱
從以上訊息我們可以得知 test.js
這個檔案是屬於 Rhadow 的,它的所屬群組為 staff,並且是在 11 月 21 日的下午 12:52 分建立的。等等?群組跟權限是什麼東西?讓我們繼續看下去。
檔案權限
在 Unix 的系統中,有使用者與群組的概念。因此我們可以簡單地將使用某檔案的人歸類為以下三類:
- 檔案擁有者
- 與檔案在同一個群組的使用者
- 其他使用者 (不是檔案擁有者也不在檔案所屬群組內的人)
簡單來說,假設你與朋友們有個聊天群組,你在群組內分享了某個檔案,這時:
- 你就是檔案擁有者
- 在聊天群組的朋友們就是與檔案在同一個群組的使用者
- 其他不在群組裡的人們就是其他使用者
在了解使用者與群組之後,我們來看看剛剛的第一列英文字在表達些什麼吧。
-rw-r--r-- 1 Rhadow staff 0 11 21 12:52 test.js
drwxr-xr-x 2 Rhadow staff 68 11 21 12:52 testDir
代表權限的那串英文總共有十個字母,第一個字母代表類型:
-
代表檔案d
代表目錄 (directory)
接下來的九個字母請將它們分為三組,每三個字一組:
- 第一組:檔案擁有者的權限
- 第二組:與檔案在同一個群組的使用者的權限
- 第三組:其他使用者的權限
而每一組內的三個字母則代表:
- 第一個字母:讀取權限 (read)
- 第二個字母:寫入/修改權限 (write)
- 第三個字母:執行權限 (execute)
這三個字母的順序是固定而且不會省略的,因此當某檔案無寫入權限但可讀可執行時會顯示成 r-x
而不是 rx
。
現在再回到範例就可清楚的解讀權限那列的意思了,舉例來說:
-rw-r--r-- 1 Rhadow staff 0 11 21 12:52 test.js
- test.js 是個檔案
- 對檔案擁有者來說,他可以對這檔案做讀取與寫入的動作但無法執行它 (rw-)
- 與檔案在同一個群組的使用者只可讀取,不能做其他動作 (r–)
- 其他使用者一樣只可讀取,不能做其他動作 (r–)
當然,像 Unix 這麼複雜的系統不可能將所有動作濃縮成三個字母來分類,因此這三個位置有可能出現像是 s
或 t
的其他字母,而類型也不會只有 -
與 d
而已喔。有興趣的人可以自行去網路上查看其他字母代表的意義。
改變檔案權限
了解如何讀懂檔案權限後,接下來來看看有哪些指令可以讓我們修改這些權限吧。
改變檔案擁有者 (chown)
使用方法:
> chown 新擁有者名稱 檔案或目錄名稱
> chown 新擁有者名稱:新群組名稱 檔案或目錄名稱
縮寫的腦補:
chown: change owner (改變擁有者)
chown
有兩種使用方法,一種是單純改變擁有者,另一種則是可以同時修改擁有者與群組。
改變檔案所屬群組 (chgrp)
使用方法:
> chgrp 新群組名稱 檔案或目錄名稱
縮寫的腦補:
chgrp: change group (改變群組)
chgrp
使用上與 chown
類似,但修改的是所屬群組。
修改檔案權限 (chmod)
使用方法:
> chmod 數個(0-7)的數字 檔案或目錄名稱
> chmod 字串 檔案或目錄名稱
縮寫的腦補:
chmod: change mode (改變模式)
chmod
有兩種使用方法,分別是數字模式與文字模式。
數字模式
在數字模式,上述講到的權限 (r
, w
, x
) 會被分類為以下數字:
r
: 4w
: 2x
: 1-
: 0
直接以實例說明比較清楚:
假如我們想將 test.js
的權限設為 rwxrw-r--
,計算如下:
rwx
: 4 + 2 + 1 = 7
rw-
: 4 + 2 + 0 = 6
r--
: 4 + 0 + 0 = 4
接著把數字帶入指令:
> chmod 764 test.js
文字模式
在文字模式,使用者與群組將會被以下字母代表:
u
: 檔案擁有者 (之前是 owner,到這裡變user了…)g
: 與檔案在同一個群組的使用者 (group)o
: 其他使用者 (others)a
: 以上所有人 (all)
同時也會有三種動作:
+
: 增加-
: 刪除=
: 指定
組合範例:
動作字串 | 意義 |
---|---|
a+r | 所有人都增加讀取權限 |
o-rx | 刪除其他使用者的讀取與執行權限 |
+r | 當前面沒帶入目標時,預設為全體,等同於 a+r |
u=x,g=r,o= | 擁有者只可執行,群組只可讀取,其他人無法執行任何動作 |
實際範例:
我們想將 test.js
群組 (group) 的權限改為可執行時可使用下列字串:
g+x
執行結果:
> ls -l test.js
-rw-r--r-- 1 Rhadow staff 0 11 21 12:52 test.js
> chmod g+x test.js
> ls -l test.js
-rw-r-xr-- 1 Rhadow staff 0 11 21 12:52 test.js
文字模式可以讓我們在不改動其他權限的狀況下修改特定目標的權限。
改變目錄底下所有內容的權限
以上提到的三個指令都可以使用 -R
選項。
縮寫的腦補:
-R: Recursive (遞歸)
使用在目錄上時會將所有子目錄內的權限也一併修改。
切換目錄 (cd)
本篇最後一個說明的指令就是 cd
囉,相信這個也是大家都熟知的指令,使用方式為:
> cd 目標目錄 (可使用相對或絕對路徑)
比較特別的是我們可以使用以下符號來切換到特定的目錄去:
~
: 到家目錄 (home directory)-
: 回到上一個目錄 (類似瀏覽器的上一頁,也就是你剛剛所在的目錄)
當沒有指定目標目錄時,預設是回到家目錄喔。