Syllabus
   本課程主要講義 https://iottalk.vip/6     本班各同學網頁的網址
  * 🅶vm亞歷克羅斯:程式、跨領域、終身學習,是未來成功關鍵
關於 Linux / Unix 常用命令介紹
以下資料很面熟吧?
對啦, 就是從 iottalk.vip/6 那抄來的啦 !

   可以只打機器名稱或 IP ;             也可順便把要登入的帳號先打進去, 如以下右邊的圖:

上右邊圖顯示使用 PieTTY (台大把 PuTTY 拿來改的版本) 準備連入 iottalk.vip 的帳號 test38              
密碼是 1234 請不要改掉, 以免其他人無法測試

 
請注意, 命令窗開啟後, 請立即點最上面"選項"然後把文字編碼設為 UTF-8 或 Unicode,
否則中文字會變亂碼, 程式中有亂碼則編譯會有錯誤! 這是因為預設編碼是 Big5;
登入後, 當然是在"家目錄" (Home Directory), 請大家不要在這建立檔案以免太亂 :-)
就是說請大家"開房間" -- 建立一個你自己要用的子目錄 (當然可以 cd 進入別人子目錄偷看:-)
你現在就可以用 mkdir 造個子目錄, 然後 cd 進入該目錄, 接著 nano w.py 建立檔案
因為這是共用, 子目錄名稱命名請用自己身分證號第一字加後三碼開頭免得和別人撞到 :-)
例如,
      mkdir p007  
      cd p007        
      nano w.py    

nano 編輯文件檔案, 只要記得 CTRL_S 是存檔, CTRL_X 是離開就可, 就是這麼簡單 :-)
對啦, 還要記得可以按上下左右鍵移到你要的位置 :-)

玩過Linux的人都知道,Linux中的命令非常多,但其實你只要熟悉最常用的幾個命令就可以了。搞不清楚時除了可以問問man,也可以問問Google大神(只要打對Keyword關鍵字)就有答案。
啥? 不知道啥是Linux以及 Linux 的命令喔,阿就是你用 SSH 工具(例如 PuTTY 或 PieTTY 甚至安裝的 ssh 命令)連去如 iottalk.vip 這機器用的命令就是 Linux 命令啦。
因為 iottalk.vip 這部在雲端的電腦(稱為 VPS, 虛擬個人主機)我是安裝了 Ubuntu Linux 18.04 版本,Ubuntu 是眾多 Linux 版本中最多人使用的版本,有問題在網路上最容易找到答案。以下就列出 二十幾個最常用的 Linux / Unix 命令。

1、cd命令 和 mkdir 命令
cd 用來切換目前的目錄,mkdir 則是製造一個目錄,參數都是目錄路徑名稱,可以是絕對路徑,也可以是相對路徑。如:
cd /etc/ssh # 切換到絕對路徑的目錄 /etc/ssh
mkdir ggyy #  在目前的目錄下造出 ggyy 子目錄
cd ggyy # 切換到目前的目錄下的 ggyy 子目錄中,也可以打成 cd ./ggyy 因為“.”表示目前的目錄 
cd .. # 切換到上層目錄,“..”表示上一層目錄
mkdir ggyy/haha   #  在目前的目錄下的 ggyy 子目錄內造出一個子目錄 haha (孫目錄 :-)
cd ggyy/haha    # 切換到目前的目錄下的 ggyy 子目錄內的子目錄 haha 之下

2、pwd 命令
查看目前身在何處 ? 阿就是印出目前的工作目錄名稱啦(Print Working Directory)
自己打 pwd 看看, 這就不必舉例了 !

3、ls命令
查看檔案與目錄的命令(類似 Windows 的 dir命令),ls 就是 list 的意思,它的參數非常多,下面就列出一些常用的參數:
-l :列出長資料串,包含檔案的屬性與存取許可權資料等
     ( 這很常用, 所以一般用 alias ll='ls -l' 使得 ll 命令就是 ls -l )
-a :列出全部的檔案,包括隱藏檔(開頭為.的檔案)一起列出來
-d :僅列出目錄本身,而不是列出目錄內的檔案資料
-R :連同子目錄的內容一起列出(遞迴列出),等於該目錄下的所有子子孫孫檔案都會顯示出來
註:這些參數也可以組合使用,例如:
    ls -lR #以長資料串的形式列出目前的目錄下的所有檔案

4、history 命令
用來查看之前用過哪些命令。
自己打 history 看看, 這也不必舉例吧 !

5、alias命令
用來製造出新命令以便簡化命令節省打字時間,例如:
alias h='history'     #  以後打 h 就代表打  history
alias ll='ls -l'      # 以後打 ll 就代表打  ls -l
alias dir='ls -l'      # 以後打 dir 也是代表打  ls -l

6、cp命令
這命令用來複製檔案,copy之意,它還可以把多個檔案一次性地複製到一個目錄下,它的常用參數如下:
-a :將檔案的特性一起複製
-i :若目的檔案已經存在時,在覆蓋時會先詢問操作的進行
-p :連同檔案的屬性一起複製,而非使用預設方式,與-a相似,常用於備份
-r :遞迴持續複製,用於目錄的複製行為
-u :目的檔案與原始檔案有差異時才會複製
例如 :
cp -a file1 file2 #連同檔案的所有特性把檔案file1複製成檔案file2
cp -i -p ggg  yyy   #  把 ggg 複製到 yyy 但如果 yyy 已經存在要問是否蓋掉, 還有 -p 使得複製後日期時間都相同 !
cp file1 file2 file3 dir #把檔案file1、file2、file3複製到目錄dir中

7、mv命令
該命令用於移動檔案、目錄或更名(rename),mv 意思是 move,它的常用參數如下:
-f :force強制的意思,如果目的檔案已經存在,不會詢問而直接覆蓋
-i :若目的檔案已經存在,就會詢問是否覆蓋 
註:該命令可以把一個檔案或多個檔案一次移動到資料夾中,但是最後一個參數一定要是“目錄”。
例如:
mv file1 file2 file3 ggdir 
   # 上列命令把文件file1、file2、file3全部移動到目錄 ggdir (必須已存在的目錄)內
mv file1 file2 # 把檔案file1重命名(rename)為file2

8、rm命令
該命令用於刪除檔或目錄,remove之間,它的常用參數如下:
-f :就是force的意思,忽略不存在的檔,不會出現警告消息
-i :互動模式,在刪除前會詢問用戶是否操作
-r :遞迴刪除,最常用於目錄刪除,它是一個非常危險的參數
例如:
rm -i file # 刪除檔file,在刪除之前會詢問是否進行該操作
rm -fr dir # 強制刪除目錄dir中的所有檔

9、cat 命令、more命令、less命令
cat 命令用來查看文字檔案的內容,通常可用管道(| 垂直線)搭配more或less一起使用,從而可以一頁頁地查看資料。例如:
cat text | more   # 查看text檔內容, 每頁會暫停等你敲空白或按 ENTER (打 5 按 ENTER 看看)
cat text | less # less 和 more 類似, 但可以倒退(敲 b 看看) (敲 h 可看到 help)
more text   #  和 cat text |  more  完全相同

10、nano命令、vi命令、vim命令
這三個都是用來編輯文字檔案,你可以打情書或打程式碼,如果檔存在就打開,如果檔不存在就以該檔案名創建一個檔。 nano是所見及所得,適合比較不專業的人員,因為只要上下左右鍵以及記得敲 CTRL_S 存檔和 CTRL_X 離開即可。 vi 和 vim (意思是改良的 vi) 是非常好用的文字編輯器,有很多非常好用的命令,比較適合專業人員使用說。 關於 vi 和 vim 的命令可以自己問 Google 大神(或在編輯檔案時敲 h 看 help 訊息)。

11、python3 命令、gcc 命令、g++命令
這些是拿來執行或編譯程式碼。
python gg.py    #  用 python2 執行 gg.py 
python3 gg.py   # 用 python3 執行 (注意 Linux 內建 python2, 但 python3 要自己安裝才會有)
gcc 用來編譯/鏈結 (Compile/Link) C 語言檔案
g++ 用來編譯/鏈結 (Compile/Link) C++ 語言檔案
註: gcc 和 g++ 是可以互通的, 只是預設行為不同 !
以下介紹gcc的常用參數:
-o :output之意,用於指定生成一個可執行檔案的檔案名
-c :用於把原始檔案生成目的檔案(.o),並阻止編譯器創建一個完整的程式
-I :增加編譯時搜索標頭檔案的路徑
-lm:表示標準庫的目錄中名為libm.a的函式程式庫
-lggyy:表示標準庫的目錄中名為libggyy.a的函式程式庫(假設真的有這 libggyy.a 程式庫檔案)
-L :增加編譯時搜索靜態連接庫的路徑
-S :把原始檔案生成組合語言代碼(Assembly code)文件
-lpthread :連接NPTL實現的執行緒庫(Thread Library)
-std= :用於指定要使用的C語言版本
例如:
# 把原始檔案test.c按照c99標準編譯成可執行程式test
gcc -o test test.c -lm -std=c99
# 以下把原始檔案test.c轉換為相應的組合語言程式原始檔案test.s
gcc -S test.c

12、grep命令
該命令常用于分析一行的資訊,若當中有我們所需要的資訊,就將該行顯示出來,該命令通常與管道命令一起使用,用於對一些命令的輸出進行篩選加工等等,它的簡單語法為
grep [-acinv] [--color=auto] '查找字串' filename
它的常用參數如下:
-a :將binary檔以text檔案的方式查找資料
-c :計算找到‘查找字串’的次數
-i :忽略大小寫的區別,即把大小寫視為相同
-v :反向選擇,即顯示出沒有‘查找字串’內容的那一行
例如:
# 取出檔/etc/man.config中包含MANPATH的行,並把找到的關鍵字加上顏色
grep --color=auto 'MANPATH' /etc/man.config
# 把ls -l的輸出中包含字母file(不區分大小寫)的內容輸出
ls -l | grep -i file

13、find命令
find是一個基於查找的功能非常強大的命令,相對而言,它的使用也相對較為複雜,參數也比較多,所以在這裡將給把它們分類列出,它的基本語法如下:
find [PATH] [option] [action]
	
# 與時間有關的參數:
-mtime n : n為數位,意思為在n天之前的“一天內”被更改過的檔;
-mtime +n : 列出在n天之前(不含n天本身)被更改過的檔案名;
-mtime -n : 列出在n天之內(含n天本身)被更改過的檔案名;
-newer file : 列出比file還要新的檔案名
例如:
find /root -mtime 0 # 在目前的目錄下查找今天之內有改動的檔
	
# 與用戶或用戶組名有關的參數:
-user name : 列出文件所有者為name的文件
-group name : 列出檔案所屬用戶組為name的檔
-uid n : 列出檔案所有者為用戶ID為n的檔
-gid n : 列出檔案所屬用戶組為用戶組ID為n的檔
例如:
find /home/ljianhui -user ljianhui # 在目錄/home/ljianhui中找出所有者為ljianhui的檔
	
# 與文件許可權及名稱有關的參數:
-name filename :找出檔案名為filename的檔
-size [+-]SIZE :找出比SIZE還要大(+)或小(-)的文件
-tpye TYPE :查找檔案的類型為TYPE的檔,TYPE的值主要有:一般檔(f)、設備檔(b、c)、
	目錄(d)、連接檔(l)、socket(s)、FIFO管道文件(p);
-perm mode :查找檔許可權剛好等於mode的檔,mode用數字表示,如0755;
-perm -mode :查找檔許可權必須要全部包括mode許可權的檔,mode用數字表示
-perm +mode :查找檔許可權包含任一mode的許可權的檔,mode用數字表示
例如:
find / -name passwd # 查找檔案名為passwd的檔
find . -perm 0755 # 查找目前的目錄中文件許可權的0755的文件
find . -size +12k # 查找目前的目錄中大於12KB的檔,注意c表示byte

14、ps命令
該命令用於將某個時間點的進程運行情況選取下來並輸出,process之意,它的常用參數如下:
-A :所有的行程(process, 進程, 執行中的程式稱之)均顯示出來
-a :不與terminal有關的所有行程(進程)
-u :有效使用者的相關行程(進程)
-x :一般與a參數一起使用,可列出較完整的資訊
-l :較長,較詳細地將PID的資訊列出
其實我們只要記住 ps 幾個常用的命令參數:
ps aux # 查看系統所有的進程資料, 列出時最左邊為 user 名稱
ps ax # 查看不與terminal有關的所有進程
ps -lA # 查看系統所有的進程資料
ps axjf # 查看連同一部分進程樹狀態

15、kill命令
用來殺掉某個 process
其實 kill 命令是向某個工作(%jobnumber)或者是某個PID(process id)傳送一個信號要求他工作行程(process)自殺,它通常與ps和jobs命令一起使用,基本語法如下:
kill -signal PID
signal的常用參數如下:
註: - 減號接著的 signal 可以用數字, 也可以用文字代號。
1:SIGHUP,啟動被終止的進程
2:SIGINT,相當於輸入Ctrl_C,中斷一個程式的進行
9:SIGKILL,強制中斷一個進程的進行
15:SIGTERM,以正常的結束進程方式來終止進程
17:SIGSTOP,相當於輸入Ctrl_Z,暫停一個進程的進行
例如:
# 以正常的結束進程方式來終於第一個後臺工作,可用jobs命令查看後臺中的第一個工作進程
kill -SIGTERM %1      # %1 是 用 jobs 看到編號 1 的 job
kill -15 %1      #  同 kill -SIGTERM %1

# 重新改動 process ID為 3388 的行程(進程),PID可用ps命令通過管道命令加上grep命令進行篩選獲得
kill -SIGHUP  3388    #   殺掉 process ID 為 3388 的 process 並且重新啟動
kill -1  3388    #  同 kill -SIGHUP  3388

# 強制結束 process ID 為 3388 的行程(進程)
kill -SIGINT  3388    #  等於對 3388 這 process 敲 CTRL_C 要求中斷程式的進行
kill -2  3388    #  同 kill -SIGINT  3388
kill  3388     #  同 kill -SIGINT  3388
kill -9  3388    #  強制殺死 process ID 為 3388 的行程
   # 因為有時用 kill -2 殺不死, 程式可以寫成不管 SIGINT 信號 !)

16、killall命令
該命令用來殺死用某個命令名稱啟動的所有 process,它的一般語法如下:
killall [-signal] [-iIe] [command name]
它的參數如下:
-i :互動式的意思,若需要刪除時,會詢問用戶
-e :表示後面接的command name要完全相同才會殺,因command name不能超過15個字元,預設只要前15字相同就會被殺掉!
-I :命令名稱忽略大小寫(Ignore case sensitive)
例如:
killall -9 python3    #  殺死所有執行 python3 的 process (行程, 進程)
killall -2 -i python3    #  逐一詢問是否要結束執行 python3 各 process
    # 用 -i 時會逐一顯示 PID (process ID) 讓你打 y 或 n
    # 用 -2 相當於對該process敲 CTRL_C 也就是要求該 process 自殺
killall -SIGHUP syslogd # 重新啟動syslogd

17、file命令
該命令用於判斷接在file命令後的檔案的基本資料,因為在Linux下檔案的類型並不是以尾碼為分的,所以這個命令對我們來說就很有用了,它的用法非常簡單,基本語法如下:
file filename
例如:
file test.html # 檢查這 test.html 到底是啥? 有些同學不小心做 mkdir test.html 阿就變成目錄囉 !

18、tar命令
用來把檔案或資料夾打包(備份),預設情況只打包並不會壓縮,如果指定了相應的參數,它還會調用相應的壓縮程式(如gzip和bzip等)進行壓縮和解壓。它的常用參數如下:
-c :新建打包文件
-t :查看打包檔案的內容含有哪些檔案名
-x :解打包或解壓縮的功能,可以搭配-C(大寫)指定解壓的目錄,注意-c,-t,-x不能同時出現在同一條命令中
-j :通過bzip2的支持進行壓縮/解壓縮
-z :通過gzip的支持進行壓縮/解壓縮
-v :在壓縮/解壓縮過程中,將正在處理的檔案名顯示出來
-f filename :filename為要處理的文件
-C dir :指定壓縮/解壓縮的目錄dir
不要被那麼多參數嚇到,只需要記住下面六條例子即可:
打包:tar -cvf filename.tar  要被處理的文件或目錄名稱
查詢:tar -tvf filename.tar    #  - 減號可以省掉,  尾巴 .tar 只是方便人類看
解開:tar xvf filename.tar     #  用 -xvf  和 xvf 意思相同
壓縮:tar -jcv -f filename.tar.bz2 要被處理的文件或目錄名稱   # 尾巴寫字 .bz2 只是方便人類看
查詢:tar tvf filename.tar.bz2     #  其實 tar 才不管你用啥檔案名稱, 用 .bz2 只是方便人類看 
解壓:tar jxvf filename.tar.bz2 -C 要解壓縮的目錄
註:檔案名並不定要以尾碼tar.bz2結尾,這裡主要是為了說明使用的壓縮程式為bzip2

19、chmod命令
該命令用於改變檔案的許可權(R讀 W寫 X執行),一般的用法如下:
chmod [-R] xyz 檔案或目錄
    -R:進行遞迴的持續更改,即連同子目錄下的所有子子孫孫檔案都會更改
還有,chmod 可以使用u(user)、g(group)、o(other)、a(all),
以及 +(加入)、-(刪除)、=(設置)跟rwx搭配來對檔案的許可權進行更改。
例如:
  chmod 0755 file # 把file的檔案許可權改變為-rwxr-xr-x
  chmod g+w file # 向file的文件許可權中加入用戶同群組(group)的可寫許可權

20、chown命令
用來改變檔案的擁有者and/or群組,類似的chgrp命令是改變檔案所屬群組。
例如:
  chown tsaiwn file.name    #  把 file.nam 的擁有者改為 tsaiwn  (要有權限才可)
  sudo chown tsaiwn file.name   #  通常搭配 sudo 就可以(當然要有 sudo 權限)
  sudo chown test38.guest file.name   #  把 file.nam 的擁有者改為 test38, 群組改為 guest 

21、man 命令
這命令用來查詢 Linux 各命令的用法,man 是 Manual 不是 Man 男人喔 !
例如:
  man intro    #  這個會告訴你 Linux 系統命令的概念
  man man   # 看看 man 有啥用以及如何用
  man vim   # 查詢 vim  的各命令