linux指令

要成為一個真正的軟體工程師(Software Engineer)不一定要使用 vim 之類的編輯器進行開發,但熟悉使用終端機(terminal)操作和常用的 Linux 命令列指令碼操作則是必須的。因此我們將介紹軟體工程師在開發上常用的 Linux 命令列指令碼。

Reference:

TechBridge 技術共筆部落格

檔案與目錄管理指令

在 Ubuntu 中我們可以打開終端機進行指令操作,就可以透過指令來管理檔案。
    ls, pwd, mkdir, cp, cd
  1. ls:list,查看檔案及子目錄
  2. 列出基本資料夾資料: ls 列出詳細資料和隱藏資料:
    pi@raspberrypi:~ $ ls bin Documents MagPi Pictures Raspberry_Pi.jpg Videos Desktop Downloads Music Public Templates
    $ ls -la 列出部分檔案: // 列出為 .js 的檔案 $ ls *.js
  3. pwd:print work directory,印出目前工作目錄
  4. $ pwd pi@raspberrypi:~ $ pwd
  5. mkdir:make directory,創建新資料夾
  6. pi@raspberrypi:~ $ mkdir RASP pi@raspberrypi:~ $ ls bin Documents MagPi Pictures RASP Templates Desktop Downloads Music Public Raspberry_Pi.jpg Videos
  7. cp:copy,複製檔案
  8. pi@raspberrypi:~ $ cp Raspberry_Pi.jpg RASP pi@raspberrypi:~ $ ls RASP Raspberry_Pi.jpg pi@raspberrypi:~ $ ls bin Documents MagPi Pictures RASP Templates Videos Desktop Downloads Music Public Raspberry_Pi.jpg thu03.png pi@raspberrypi:~ $ cp thu03.png thu01.png pi@raspberrypi:~ $ ls bin Documents MagPi Pictures RASP Templates thu03.png Desktop Downloads Music Public Raspberry_Pi.jpg thu01.png Videos
  9. cd:change directory,移動進入資料夾
  10. pi@raspberrypi:~ $ cp thu* RASP pi@raspberrypi:~ $ ls RASP Raspberry_Pi.jpg thu01.png thu03.png pi@raspberrypi:~ $ pwd 移動到目前資料夾下的 RASP 資料夾: $ cd RASP 移動到家目錄:~: $ cd ~ 移動到上一層目錄 ..: $ cd .. 移動到根目錄 /: $ cd /

    nano, clear, cat, more, head, tail, mv, rm, rm -rf
  11. nano:在終端機編輯文字檔案
  12. 編輯或是新增文字檔案: $ nano data.txt 啟動編輯完後可以使用 Ctrl + X 離開,Ctrl + V 移動到上一頁, Ctrl + Y 移動到下一頁,Ctrl + W 搜尋文字內容
  13. clear
  14. 清除終端機螢幕上的內容。 $ clear
  15. cat:將文件印出在終端機上
  16. $ cat stud.txt
    1 125 2 0 3 110 4 0 5 108 6 0 7 0 8 24 9 20 10 61 11 81 12 138 13 0 14 0 15 20 16 81 17 0 18 55 19 56 20 86 21 0 22 0 23 0 24 15 25 103 26 71 27 96 28 145 29 122 30 36 31 76 32 145 33 15 34 71        35 91 36 71 37 46 38 0 39 20 40 20 41 26 42 91 43 91 44 0 45 0 46 0 47 20 48 0 49 0 50 150 51 0 52 130 53 54 54 0 55 35 56 115 57 20 58 0 59 150 60 0 61 0 62 103 63 125 64 145 65 15 66 51 67 20
  17. more:將檔案一頁頁印在終端機上
  18. 可以使用上下移動換頁,按 q 離開: $ more stud.txt
  19. head:顯示檔案最前幾行內容
  20. $ head stud.txt $ head -3 stud.txt
  21. tail:顯示檔案最後幾行內容
  22. $ tail stud.txt $ tail -3 stud.txt
  23. mv:move (rename) files,移動檔案或是重新命名檔案
  24. 移動檔案:
    pi@raspberrypi:~ $ ls bin Desktop MagPi Public stud.txt thu03.png data-1.txt Documents Music RASP Templates Videos data.txt Downloads Pictures Raspberry_Pi.jpg thu01.png pi@raspberrypi:~ $ mv data-1.txt data-2.txt pi@raspberrypi:~ $ ls bin Desktop MagPi Public stud.txt thu03.png data-2.txt Documents Music RASP Templates Videos data.txt Downloads Pictures Raspberry_Pi.jpg thu01.png pi@raspberrypi:~ $ mv data-2.txt RASP pi@raspberrypi:~ $ ls bin Desktop Downloads Music Public Raspberry_Pi.jpg Templates thu03.png data.txt Documents MagPi Pictures RASP stud.txt thu01.png Videos pi@raspberrypi:~ $ ls RASP data-2.txt Raspberry_Pi.jpg thu01.png thu03.png
  25. rm:remove file,刪除檔案
  26. pi@raspberrypi:~ $ ls bin Desktop Downloads Music Public Raspberry_Pi.jpg Templates thu03.png data.txt Documents MagPi Pictures RASP stud.txt thu01.png Videos pi@raspberrypi:~ $ rm data.txt pi@raspberrypi:~ $ ls bin Documents MagPi Pictures RASP stud.txt thu01.png Videos Desktop Downloads Music Public Raspberry_Pi.jpg Templates thu03.png pi@raspberrypi:~ $ ls RASP
    刪除目前資料夾下副檔名為 .txt 檔案: $ rm *.txt
  27. rm -rf :刪除資料夾和所有檔案:
    pi@raspberrypi:~ $ pwd /home/pi pi@raspberrypi:~ $ ls bin Desktop MagPi Public stud.txt thu03.png data-1.txt Documents Music RASP Templates Videos data-2.txt Downloads Pictures Raspberry_Pi.jpg thu01.png pi@raspberrypi:~ $ mkdir NEWdir pi@raspberrypi:~ $ ls bin Desktop MagPi Pictures Raspberry_Pi.jpg thu01.png data-1.txt Documents Music Public stud.txt thu03.png data-2.txt Downloads NEWdir RASP Templates Videos pi@raspberrypi:~ $ cp stud.txt NEWdir pi@raspberrypi:~ $ ls NEWdir stud.txt pi@raspberrypi:~ $ rm NEWdir rm: 無法移除 'NEWdir': 是個目錄 pi@raspberrypi:~ $ rm -f NEWdir rm: 無法移除 'NEWdir': 是個目錄 pi@raspberrypi:~ $ rm -r NEWdir pi@raspberrypi:~ $ ls bin Desktop MagPi Public stud.txt thu03.png data-1.txt Documents Music RASP Templates Videos data-2.txt Downloads Pictures Raspberry_Pi.jpg thu01.png

  28. touch:用來更新已存在文件的 timestamp 時間戳記或是新增空白檔案
  29. $ touch README.md
  30. file:檢查檔案類型
  31. $ file README.md // README.md: HTML document text, UTF-8 Unicode text
  32. vim:在終端機編輯文字檔案
  33. $ vim README.md 啟動後,使用 i 進入編輯,esc 離開編輯模式,:q 不儲存離開, :wq 儲存離開,:q! 強制離開

檔案權限設定

在 Linux 系統中,每一個 Linux 檔案都具有四種存取權限: 可讀取(r,Readable),用數字 4 表示 可寫入(w,writable),用數字 2 表示 可執行:(x,eXecute),用數字 1 表示 無權限(-),用數字 0 表示 系統管理者依據使用者需求來設定檔案權限,若我們想檢視檔案權限可以使用 $ ls -l 來查看:
    接下來介紹如何透過指令修改權限:
  1. chmod:修改檔案權限
  2. 將權限設為 rw-rw-r--: $ chmod 664 README.md 將檔案的使用者和群組加入執行權限 $ chmod ug+x README.md
  3. chown:修改檔案擁有者與群組
  4. $ chown www-data:www-data README.md
  5. sudo:使用最高權限(superuser)執行指令,會要求輸入自己密碼,使用上必須非常小心
  6. $ sudo git clone xxx.py
  7. su:su 指令可以讓一般的 Linux 使用者輸入 root 密碼取得 root 權限, 暫時取得 root 權限的使用者就如同 root 一樣可以對系統進行各種變更動作
  8. $ su
  9. kill:根據 Process ID 指定要終止程式
  10. $ kill PID 立即強制執行: $ kill -9 PID killall:直接使用程式的名稱來指定要終止的程式 $ killall hello.py
  11. apt-get:套件管理工具
  12. 更新套件資料庫列表: $ sudo apt-get update 升級套件並下載安裝套件: $ sudo apt-get upgrade 搜尋相關軟體套件(使用名稱): $ apt-cache search --names-only fortune 安裝套件: $ sudo apt-get install fortune 移除套件: $ sudo apt-get remove fortune 網際網路相關操作
  13. ping:網路檢測工具,透過發送 ICMP ECHO_REQUEST 的封包,檢查自己與特定設備 之間的網路是否暢通,速度是否正常
  14. 可輸入 hostname 或是 IP:
  15. $ ping google.com
  16. PING google.com (172.217.160.110): 56 data bytes 64 bytes from 172.217.160.110: icmp_seq=0 ttl=57 time=7.037 ms 64 bytes from 172.217.160.110: icmp_seq=1 ttl=57 time=9.411 ms 64 bytes from 172.217.160.110: icmp_seq=2 ttl=57 time=22.690 ms 64 bytes from 172.217.160.110: icmp_seq=3 ttl=57 time=6.561 ms 64 bytes from 172.217.160.110: icmp_seq=4 ttl=57 time=6.909 ms 64 bytes from 172.217.160.110: icmp_seq=5 ttl=57 time=6.311 ms 64 bytes from 172.217.160.110: icmp_seq=6 ttl=57 time=6.860 ms 64 bytes from 172.217.160.110: icmp_seq=7 ttl=57 time=6.583 ms
  17. traceroutes:檢查從你的電腦到網路另一端的主機是走的什麼路徑
  18. $ traceroute google.com traceroute to google.com (172.217.27.142), 64 hops max, 52 byte packets 1 zyxel.home (192.168.1.1) 2.047 ms 1.208 ms 1.888 ms 2 h254.s98.ts.hinet.net (168.95.98.254) 6.189 ms 8.556 ms 5.875 ms 3 168-95-85-2.hinet-ip.hinet.net (168.95.85.2) 7.057 ms 5.796 ms 5.998 ms 4 211-22-226-1.hinet-ip.hinet.net (211.22.226.1) 9.766 ms 10.422 ms 72.14.222.94 (72.14.222.94) 9.744 ms 5 108.170.244.97 (108.170.244.97) 8.386 ms 108.170.244.129 (108.170.244.129) 11.500 ms 12.247 ms 6 209.85.142.13 (209.85.142.13) 7.015 ms 7.505 ms 209.85.240.15 (209.85.240.15) 6.750 ms 7 tsa03s02-in-f142.1e100.net (172.217.27.142) 11.478 ms 6.608 ms 6.893 ms
  19. nslookup:查詢 DNS 回應是否正常
  20. $ nslookup google.com Server: 192.168.1.1 Address: 192.168.1.1#53 Non-authoritative answer: Name: google.com Address: 216.58.200.238

其他好用指令

  1. man:查詢 Linux 線上手冊(man page)
  2. $ man 例如我們可以使用 man 來查詢 ls 的使用用法: $ man ls find:查詢檔案
  3. 在目前目錄下尋找檔名為 README.md 檔案
  4. $ find . -name README.md
  5. grep:強大文件字串搜尋工具
  6. $ grep '找這個字串' file_name 找所有目錄(含子目錄)下檔案 $ grep -r '字串' * crontab:例行性工作排程
  7. 編輯 crontab
  8. $ crontab -e crontab 格式: 分 時 日 月 星期 要執行的指令 30 12 * * * python /projects/hello.py & 在 12:30 時執行 hello.py,& 表示背景執行 * 號表示每日每月每星期都執行
  9. 撰寫第一個 shell script
  10. Shell 是我們和 Linux 系統的介面,我們可以透過終端機在上面輸入指令和作業系統互動, 讓他做我們想做的事情。在 Linux 中標準的 Shell 為(Bourne Again Shell), 檔案路徑為 /bin/sh,我們可以透過 $ echo $SHELL 去印出目前使用的 shell。 其中 Shell Script 為使用 shell 所提供的語法所撰寫的程式碼,其為直譯式不用編譯。 可以讓你將複雜或是重複性的指令寫成程式碼檔案 $ vim example.sh 在編輯模式輸入以下程式碼,: #!/bin/bash # 這是註解,上面所使用的 shell echo "日期" date echo "印出檔案列表" ls -l 修改權限成可以執行: $ chmod u+x example.sh 接著執行,若是一切順利就可以在終端機看到時間日期和檔案列表!恭喜你完成你的第一個 shell script! $ ./example.sh

總結

以上介紹了 Linux/Ubuntu 常用指令和基礎操作的入門教學介紹上,實際上讀者不用刻意去背誦,而是在實際上操作中練習,多累積撰寫程式並使用指令碼去加快程式開發的速度自然而然就會把指令碼記憶起來了,若是真的忘記再去網路上查找就好,加油!