Try   HackMD

程式設計 linux環境配置

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

原因

為何會需要使用到終端機這樣原始的環境?而不使用window系統上的IDLE,如DEV-C++/CODE:BLOCK等?

  • 包好的IDLE,若程式牽涉到較多原理、組語等內部結構,會難以調整
  • 介面醜到不行,效率很差,背景純白如果長時間打code眼睛會爆掉
  • 開IDLE速度很慢,每新寫一段code就要新增一堆東西,效率很差,此外,如果IDLE(整合式開發環境)開的速度慢,你就不會有事沒事去開他了,而是「真正刻意」要寫程式才會去開他,是吧?
  • 練題目,測資大,你會輸入到想死
  • 我只能說,非常難看,看起來又很LOW,當然,如果你使用輕量級的Text editor沒話說,如sublime

優點

  • 不會為了一個程式語言而去裝一個IDLE,如py裝pycharm或python原版的直譯器,c++/c裝dev-c++,java裝eclipse你並不會因為語言的轉換而去更改你的環境
  • 更加了解原理,而且比較能掌控程式
  • 速度快、開啟速度超快、效率較高
  • 使用linux的terminal環境,根本不只寫程式這件事情能做呢
  • 若你使用原生的文字編輯器,如vim, emacs, nano,你可以透過遠端連線,用手機、電腦,或用電腦連手機都可以,在學校電腦遠端連自己電腦,而不需要重新設定你的環境
  • 如果你靠資訊吃飯,用IDLEWell, 也許他自動補全很方便,但他速度真的爆慢,而且很多事情在vim也做的到,速度、效率還更高,emacs也做的到

缺點

  • 針對window的使用者,配置較麻煩
  • 針對linux使用者隨開隨用
  • 針對mac使用者也是隨開隨用

Window的配置選擇

  • VM 虛擬機

    • 電腦效能需高些
    • Lag是常態
  • 隨身碟灌linux

    • 隨身碟開機操作會比較lag
    • 安裝較難,雖然我不覺得會很難
  • WSL

    • 有幾種配置,像是cmder+wsl/VS+wsl
    • 本篇筆記會提供cmder+wsl的文章和隨身碟linux文章

文章教學

  • VM 虛擬機

    • 10801程式設計-A班助教品新學長 製作
  • Repl 線上寫code

    可以直接線上寫code,也可選編輯器vim/emacs/預設,環境為ubuntu,常用的套件都有裝,像是git, g++, gcc, grep等等

  • Docker

    比起上面的VirtualBox,個人比較推薦這個,簡單而言,他就是個輕量級的VM,精確來說模擬機是割捨自己的硬碟空間,去佈署專屬於自己的OS環境,而Docker則是可以建立多個container,共享一個OS核心,詳細使用方法可問GOOGLE


  • 隨身碟灌Linux (第二推薦)

    你要準備兩個隨身碟
    一個是廢棄不需要用到的,容量小沒關係
    另一個是效能較好容量大的隨身碟,linux會裝在裡面


初次使用教學

終端機如何更新

  • Update (先更新套件的網址清單)
$ sudo apt-get update
  • Upgrade (再按照網址清單,去更新套件)
$ sudo apt-get upgrade

安裝

  • python (p.s 你要寫python的話再裝)
$ sudo apt-get install python

sudo代表super do,也就是以超級使用者的權限(提高權限)的意思,後面apt-get是套件安裝普遍會使用到的字眼,install代表安裝,後面接python就是安裝python,他會自動幫忙裝好

  • C++
$ sudo apt-get install g++
  • C
$ sudo apt-get install gcc
  • Makefile
$ sudo apt-get install make

拿來編譯很方便,建議裝一下
此外,你會發現,其實安裝就只是同樣一串文字,後面加上自己要裝的東西而已


文字編輯器

題外話

意即,幫助文字編輯的介面,但很多人不清楚
老手常用的有vim, emacs,兩者間還有 神之編輯器之戰

vim 被稱為編輯器之神
emacs 也被稱為 神之編輯器

順帶一提,個人很愛vim,emacs很不喜歡,因為他沒有mode模式,雖然你輸入很方便,但要移動,或做任何操作,為了不要讓鍵盤一按就馬上鍵入文字,需要用到Ctrl或Alt鍵,然而,每個按鍵組合一定要按這兩個東西加其它按鍵,個人覺得非常不方便,效率很差

當然,emacs有他厲害的地方,他擴展性很高,並且能在上面做任何事情,包括小遊戲、開pdf檔、網頁瀏覽等等,但我認為文字編輯方面他還不是那麼優秀

vim我認為是最強大的文字編輯器,不使用任何插件只配置number, autoindent等等,他效率已經非常高,幾乎到達眼到鼠標到的境界,雖然學習成本蠻高的,但在很多地方都用的到,在每個linux系統都是內建的文字編輯器,編輯效率極高

然而,加上插件他會更恐怖,包含自動補全、括號匹配,全部都做的到,對了,我這篇文也是用vim寫markdown語法所做的哦


可使用

終端機環境

  • Vim
  • emacs
  • Nano

對於初學者而言,nano簡單好入手
能夠使用nano進行簡單文書操作後,推薦學vim,效益很高
當然,學習曲線也是很高啦

網路上,流傳這麼一張圖

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

非終端機模式

  • Gedit
  • Sublime
  • Visual Studio(簡稱VS)
  • Visual Studio Code (又稱VS CODE)
  • mousepad
  • notepad
  • etc.

上述最常有人用的就是Sublime跟VS了,不過個人是vim狂人不怎麼用那些東西,非終端機模式最大問題就是要額外開一個視窗,開啟可能要一些時間

此外如果配置好了在其它電腦上卻要重新配置,終端機的文字編輯器則可以直接用ssh, putty等東西遠端連到自己電腦


程式執行教學

前情提要,在終端機下有幾個指令能用

  • ls

即list的意思,列出目前目錄下的所有檔案
後面+ -a 可顯示隱藏檔案/-l 會顯示詳細資料

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

  • pwd

列出目前路徑位置

  • chmod
    • 改變權限
    • 我想讓Makefile可以執行,於是
$ sudo chmod +x Makefile



其它指令

指令 用途 備註
rm 移除檔案 rm [filename]
mkdir 新增目錄 mkdir [dirname]
cd 切換目錄 cd 路徑/絕對路徑
cat 抓取檔案內容顯示於終端機上 cat [filename]
cp 複製檔案 cp [filename 1] [filename 2]
mv 重新命名或移動檔案 mv [filename 1] [filename 2]

C語言篇

  • 新增檔案
  • 隨便寫個程式
  • 編譯
    • 你可以選擇編譯時不加-o,如下:

      會產生的是a.out檔案
  • 多一個檔案(可執行檔)
  • 執行


  • 此外,這邊要介紹一個方法可方便編譯程式
    • 新增檔案 Makefile

    • Makefile內容

      可以簡單寫成all:
      下面寫下想要執行的指令就好
      對了,前面的空格請使用tab而非空格,不然會出事哦!

    • 輸入make

test.c

#include <stdio.h> #include <stdint.h> int main(){ printf("Hello World!\n"); return 0; }

Makefile

all: gcc test.c -o test

C++篇

  • 新增檔案&編輯檔案


  • 編譯&執行檔案

test.cpp

#include <iostream> #include <string> using namespace std; int main(){ string str; cout << "Please enter a string: "; cin >> str; cout << str << endl; return 0; }

Python篇

  • 新增檔案&編輯檔案


  • 編譯&執行

test.py

num = [int(e) for e in input('請輸入一連串的數字: ').split() ] for i in range(len(num)): print(num[i], end=' ') print()

指令詳細用法說明

cd

  • 即 change directory (切換目錄)

  • 範例

    1. 切換目錄到 /usr/bin
      $ cd /usr/bin
    2. 切換到上層目錄
      $ cd ../
    3. 切換到根目錄
      $ cd
      or
      $ cd ~

clear

  • 同字面意思,清除終端機上的文字

exit

  • 離開終端機(以任何型態使用,都是離開該環境的意思)

history

  • 同字面意思,可查詢最近使用過的指令

  • 範例

    1. 清除之前history的紀錄
      $ history -c
    2. 刪除紀錄中指令編號的紀錄
      $ history -d [number]
    3. 列出最近使用過的指令
      $ history

cp

  • 即copy簡寫,可以複製檔案或目錄

  • 範例

    1. 將檔案1 (filename_1) 複製為 檔案2 (filename_2)
      $ cp filename_1 filename2
    2. 將 /tmp 目錄複製到當前目錄下
      $ cp -r /tmp ./
    3. 複製檔案時保留原檔案的屬性
      $ cp -p /usr/bin/passwd ./
    4. 來源檔案如果比目標檔案時間還晚,才覆蓋過去 $ cp -u filename_1 filename_2
參數 敘述
-b 覆蓋之前會先備份檔案,備份檔案字尾會加上~
-f 強迫複製
-i 詢問模式,如果會覆蓋,則會先詢問操作者
-p 保留原始檔案之屬性(如範例)
-r 有r代表遞迴處理,複製目錄下所有檔案
-u 若來源檔時間較晚才覆蓋,否則不動作

pwd

  • pwd (print the working directory)
    列出目前所在目錄 (直接使用即可)

rm

  • rm(remove),可移除檔案、目錄(若移除空目錄可用rmdir)
參數 敘述
-f (force),強制移除檔案或目錄
-i (inquire),刪除之前會先詢問
-r (recursive),遞迴處理,會將改目錄下所有檔案、子目錄都刪除
  • 範例

    1. 有些壞蛋會教你輸入 sudo rm -rf ~/
      先來說文解字一下,sudo代表用超級使用者權限執行這項指令
      rmremove

      rfforce+recusive
      (強制移除+遞迴處理)
      ~/
      家目錄

      因此,這個指令會把你家目錄下所有檔案都刪掉,千萬不要執行
    2. 刪除當前目錄下名稱為 test.c的檔案,刪除之前還會詢問你
      rm -i test.c

mv

  • 即move,可以移動檔案或目錄,移動前後可以取不同的名字,因此也可以拿來當作改變名稱的指令

經過上面的指令介紹相信大家很清楚如何操作了
因此下表就直接騰列參數表

參數 敘述
-b (backup),目標檔案若存在,覆蓋時會備份原本的目標檔,名稱後方加上~
-f (force),強迫執行
-i (inquire),覆蓋前會詢問
-u 若來源檔時間比較新才會覆蓋,反之不會執行

ls

  • 即list,列出檔案或目錄
參數 敘述
-a 列出所有檔案(包含隱藏檔)
-C 使用欄位排列顯示清單
-f 不按照字母排序,而是按進入磁碟的順序排序
-h 用容易閱讀的方式顯示檔案大小,像是MdB replaced by M
-k 用KB列出檔案大小
-l 列出長清單(比較仔細)
-m 水平排列顯示每個指令,指令間用逗號區隔
-n 使用者名稱、群組名稱分別用UID, GID來取代(代號)
-r 以字母的相反順序列出
-R 遞迴處理,列出目錄以及子目錄的所有檔案
-t 按照檔案最後修改時間列出
-u 按照檔案最後存取時間列出
-Z 查看SElinux標籤

man

  • 即manual(使用手冊),在linux上,有不熟的指令可以用這個指令來查詢哦!
參數 敘述
-a 原本預設只顯示一個章節,此參數會列出所有章節(類似ls -a的意思)
-K 顯示所有和該名稱有關的線上說明檔案
-w 僅顯示說明檔的位置