---
# System prepended metadata

title: Unix 基本操作

---

# Unix 基本操作

## 簡介
Unix系統通常以文字介面來操作，以Linux系統為例，
我們可以開啟Terminal，並輸入各種指令來進行操作
簡單的從新增、刪除檔案到各種作業系統相關的進階操作都可以做到

## 工作目錄
工作目錄可以理解成你在檔案系統中的位置，所有指令都以工作目錄為中心。
假如我的檔案夾架構如下
```
|--1
|  |-A
|  └-B
└--2
   └-A
```
若我在工作目錄為1時，刪除A檔案，刪除的是1/A
若我在工作目錄為2時，刪除A檔案，刪除的是2/A

## 代稱
`. ` 當下工作目錄
`..` 上層工作目錄

## 指令
`pwd`(present working directory) 顯示當前工作目錄
`ls` (list)列出工作目錄下所有檔案
`cd [Name]` (change directory) 切換工作目錄 ex: cd Desktop, cd ..
`rm [Name]` (remove)刪除檔案
`touch [Name]` 創建新的空白檔案
`mkdir [Name]` (make directory)創建空的檔案夾

# Vim tutorial
## 簡介
Vim 是一款在大部分系統都內建的文字編輯器，因此不管是新電腦或是遠端連線到別的電腦，都可以直接使用。

## 優勢
1. 輕量
2. 不需要預先安裝
3. 使用時手完全不用離開鍵盤（高手）

## Get started
在terminal中直接輸入
`$ vim [FileName]`

## Vim的三種模式
![](https://i.imgur.com/GMEWeMu.png)
（ref:鳥哥的Linux私房菜）[1]
1. 一般指令模式: 各類指令
2. 編輯模式: 打字
3. 指令列命令模式：存擋、關閉等等
一般指令模式可以切換至 編輯模式(i) 或 指令列命令模式(/)
編輯模式 或 指令列命令模式 可以切換至一般指令模式(ESC)
但 編輯模式 和 指令列命令模式 不能直接相互切換

## 一般模式操作
### 移動
`h` 或 向左方向鍵(←) 游標向左移動一個字元
`j` 或 向下方向鍵(↓) 游標向下移動一個字元
`k` 或 向上方向鍵(↑) 游標向上移動一個字元
`l` 或 向右方向鍵(→) 游標向右移動一個字元
`nG` 游標移至第n行

### 搜尋
`/word` 尋找游標下一個word字串
`n` 再找下一個
`N` 找上一個

### 刪除、複製、貼上
`dd` 刪游標在的整行
`yy` 複製一行
`nyy` 複製游標下的n行
`p` 於游標下一行貼上
`u` 復原上一個動作

## 編輯模式
`i` 進入插入模式，於游標位置開始編輯
`ESC` 回到一般模式

其他 `I`, `a`,`A`, `o`, `O`, `r`, `R` 請自行研究

## 指令列模式
`:w` 將編輯的資料寫入硬碟檔案中(常用)
`:q` 離開 Vim(通常會fail，可以試試看`:q!`)
`:wq` 儲存後離開

# Makefile
## 簡介
make是一個工具程式，他會讀取一個名為makefile的檔案，並利用裡面的資訊來自動編譯程式。

小型的程式碼可以直接用shell command進行編譯，但大型專案通常會使用make來進行編譯。make會根據上次修改時間等資訊來決定哪些檔案需要重新編譯，因此在大型專案中可以大量節省時間。

## makefile 結構
`target`: 要生成的檔案
`dependencies`: 需要的檔案

note:縮排是Tab

```
target:dependencies
    command 1
    command 2
    ...
    command n
```

## make 流程
make程式會先找到第一個target，並且檢查depencies是否存在。如果存在，下方的command就會被依序執行並完成編譯。如果不存在，make程式則會在下方的其他target中尋找所需的dependencies，並遞迴地完成所需的target後再完成第一個target。

假設我有檔案`main.c`, `1.c`, `1.h`
並且`makefile`如下
```
all: main.o 1.o
	gcc -Wall -o a.out main.o 1.o

main.o: main.c 1.h
	gcc -c main.c

1.o: 1.c 1.h
	gcc -c 1.c
```
首先make會先找到第一個target all，發現dependencies main.o, 1.o 不存在。隨後make找到target main.o, 1.o進行編譯後再完成target all

# SSH
先去辦一個工作站帳號出來
`ssh 學號@linux[1~15].csie.ntu.edu.tw`


## Ref
[1] https://i.imgur.com/GMEWeMu.png(https://i.imgur.com/GMEWeMu.png)
[2] https://hackmd.io/@aJ0iOin3Q8aRY6TDzXaE8g/rJAU17INw(https://hackmd.io/@aJ0iOin3Q8aRY6TDzXaE8g/rJAU17INw)