---
# System prepended metadata

title: Linux 基本指令(everything is file)
tags: [linux, c]

---

# Linux 基本指令(everything is file)


###### tags: `c` `linux`
---


複習linux基本指令筆記，大部分都是邊讀[鳥哥的私房菜](https://linux.vbird.org/)邊作筆記下來的，基本上指令都在終端機man一下就可以觀看細節了，此處只列出部分常用的指令。

**實作平台: [WSL (Windows Subsystem for Linux)](https://docs.microsoft.com/zh-tw/windows/wsl/install-win10)**

---

## linux檔案系統架構
* /bin:主要放置一般使用者可以做的指令 /usr/bin
* /boot:主要放置開機相關檔案
* /dev:放置device裝置檔案
* /etc:放置系統檔案
* /home:一般用戶的家目錄
* /lib:放置系統核心函示庫 /usr/lib
* /mnt:管理員/使用者手動掛上(mount)的目錄
* /proc:將記憶體內的資料作成檔案
* /root:系統管理者的家目錄
* /sbin:主要放置系統管理者可以做的指令/usr/sbin
* /sys:與/proc相似，主要針對硬體參數
* /tmp:Temporary，放暫存檔案
* /usr:Unix Software Resource，放置系統相關軟體服務
* /var:Variable，放置變數或紀錄檔


## 檔案指令
* `ls`(檔案與目錄顯示):
    * ls -a:全部檔案，連同隱藏檔(.xxx)都顯示。
    * ls -l:長資料串列出。 
* `cd`(移動目錄):
    * cd ~:移動到家目錄。cd \.\. :移動到上一層。cd /:移動到根目錄。
* `pwd`(列印目前工作目錄):
    * pwd -p:顯示確實路徑，而非連結(link)路徑。 
* `mkdir`(建立新的目錄):
    * mkdir -m:設權限。EX: mkdir -m 777 filename
    * mkdir -p:遞迴建立。EX: mkdir -p test1/test2/test3 
* `rmdir`(刪除"空"目錄):
    * rmdir -p :遞迴刪除。 
* `rm`(刪除檔案或目錄):
    * ~~rm -f:force意思，忽略不存在的檔案，不出現警告~~。 **一定要少用** 
    * rm -i:互動模式，刪除前會詢問。
    * rm -r:遞迴刪除。

* `mv`(移動檔案與目錄，或更改名):
    * mv -f:如果目標已存在，直接覆蓋它。
    * mv -i:互動模式。
    * mv -u:如果目標已存在且source較新，才會update。 
* `cp`(複製檔案或目錄):
    * cp -i:若目標檔(destination)已存在，會詢問覆蓋。
    * cp -p:連檔案的屬性(權限 用戶 時間)一起copy過去。
    * cp -r:遞迴copy過去。    

* `cat`(由第一行開始顯示):
    * cat -b:列出行號(空白不顯示)。
    * cat -n:列出行號。
    * tac:由最後一行開始顯示。
* `nl` (添加行號列印):
    * nl -b a：表示不論是否為空行，也同樣列出行號(類似 cat -n)；
    * nl -b t :如果有空白，則跳過列出。(預設值)
* `head`(取出前面幾行):
    * head -n number filename
* `tail`(取出後面幾行):
    * tail -n number filename
* `touch`(建立新檔案):
    * touch test.c
* `which`(尋找"執行檔"):
    * which -a command:將所有PATH目錄中可以找到的指令都列出。
* `whereis`(特定的目錄中尋找檔案名):
    * whereis -l:列出whereis會去尋找的目錄。
    * whereis -b:只找binary格式的檔案。
    * whereis -s:只找source來源檔案。
    * whereis -m:只找在說明檔manual路徑下的檔案。
    * whereis -u:搜尋不再上列敘述的三個項目中，其他特殊檔案。
* `more`(將檔案一頁一頁列印在終端機顯示) **不可往前翻閱**
* `less`(將檔案一頁一頁列印在終端機顯示) **可往前翻閱**

---
友人推薦[tldr](https://github.com/tldr-pages/tldr)
![](https://i.imgur.com/lPMe99a.jpg)

輸入指令 $ tldr cp 直接在終端機查看 cp的參數功能。

[Minimum list of useful bash shortcuts](https://manukyan.dev/notes/2019-12-08-minimum-list-of-useful-bash-shortcuts/)

![](https://manukyan.dev/images/moving_cli.png)

---


## 打包&壓縮

* `tar`(打包) : 
    * tar -c: 建立打包文件
    * tar -v: 顯示打包過程
    * tar -x: 解開已打包的檔案、或解壓縮的檔案
    * tar -z: 使用gzip壓縮格式
    * tar -f: 被處理的檔名

打包一整個文件並解壓縮成gzip格式: `tar -vcz -f xxx.gz xxx`
解壓縮: `tar -vxz -f xxx.gz`

## 權限相關

在目錄下打上 ls -l會顯示出"-rwxrwxrwx"的資訊。r=可讀，w=可寫，x=可執行。
- 前半部"-rwx"是屬於 owner的權限，-:檔案 d:目錄檔案 l:連結檔。
- 中半部"rwx"是屬於 group的權限。
- 後半部"rwx"是屬於 others的權限。

**分數 r:4 w:2 x:1**
owner = rwx = 4+2+1=7
group = rw- = 4+2+0 =6
others = - - - =0+0+0 = 0

* `chmod`(改權限):
    * chmod 760 filename
    * -rw-rw-r-- =664 / -rwxr-xr-x =755
    * 以上是我最常用的方法，chmod還有其他表示法
* `chown`(改擁有者):
    * chown -R 帳號名稱/群組名稱 檔案/目錄
    * -R: 遞迴更變。
* `chgrp`(改群組):
    *  chgrp -R dirname/filename
---
* 檔案特殊權限 內容較細[鳥歌私房菜 第六章](https://linux.vbird.org/linux_basic/centos7/0220filemanager.php#suid_sgid_sbit)
    * SUID(Set UID)
    * SGID(Set GID)
    * SBIT(sticky Bit)

## BASH shell (linux 預設)

* [鳥歌私房菜 第10章](https://linux.vbird.org/linux_basic/centos7/0320bash.php#bash)

## 資料流重導向

standard output(標準輸出,**STDOUT**) => 指令所傳回的正確訊息。
standard error output(標準錯誤輸出,**STDERR**) => 指令執行失敗，所傳回的失敗訊息。

**1. 標準輸入(stdin)&nbsp; :代碼0，使用<或<<**
**2. 標準輸出(stdout)&nbsp; :代碼1，使用>或>>**
**3. 標準錯誤輸出(stderr)&nbsp; :代碼2，使用2>或2>>**

1>:已**覆蓋**方式將「正確的資料」輸出到指定的檔案或裝置上。
1>>:以**累加**方式將「正確的資料」輸出到指定的檔案或裝置上。
2>:已**覆蓋**方式將「錯誤的資料」輸出到指定的檔案或裝置上。
2>>:以**累加**方式將「錯誤的資料」輸出到指定的檔案或裝置上。

**2>/dev/null** = 丟去垃圾桶

- 用於檔案的建立 EX. cat/etc/issue > /tmp/issue
=> etc/issue 輸出至tmp/issue，如果tmp/issue不存在則建立。
- 要讓alisa指令永久有效要寫入 ~/.bash裡
=> echo "alisa cls='clear'" >> ~/.bash
- 2>&1:STDOUT與STDERR同時寫入同一個檔案
=> find /home -name .bashrc > list **2>&1**
=> find /home -name .bashrc **&>** list 
以上2種結果都一樣

## 命令執行的判斷依據

* cmd **;** cmd(不考慮指令相關性，連續下達指令)

**指令回傳值:若前一個指令執行結果為正確，在Linux底下會傳回一個$?=0的值**。

* cmd1 && cmd2:
    * 若cmd1執行完畢且正確($?=0)，則開始執行cmd2。
    * 若cmd1執行完畢且錯誤($?!=0)，則不執行cmd2。
* cmd1 || cmd2:
    *  若cmd1執行完畢且正確($?=0)，則不執行cmd2。
    *  若cmd1執行完畢且錯誤($?!=0)，則開始執行cmd2。

* 管線命令(pipe『|』):
    * 處理前一個指令傳來的"正確資訊"，對stderr沒有處理能力。


## 擷取命令指令
擷取訊息通常是針對『一行一行』來分析，並非本篇訊息。
* cut(同一行裡面的資料進行分解):
    * cut -d '分隔字元' -f number  <= 用於有特定分隔字元
    -f  ：依據 -d 的分隔字元將一段訊息分割成為數段，用 -f 取出第幾段的意思；
    * cut -c 字元區間            <=用於排列整齊的訊息
    
常使用在分析一些數據和文字資料時。
* grep(分析一段訊息，如有符合的資訊就擷取出來):
    * -a ：將 binary 檔案以 text 檔案的方式搜尋資料。
    * -c ：計算找到 '搜尋字串' 的次數。
    * -i ：忽略大小寫的不同，所以大小寫視為相同。
    * -n ：順便輸出行號。
    * -v ：反向選擇，亦即顯示出沒有 '搜尋字串' 內容的那一行。

## Process

[另一篇Process的流程](https://hackmd.io/Zp7uUl5KTpSZSviYantg8w?view#%E4%BD%9C%E6%A5%AD%E7%B3%BB%E7%B5%B1OS)

* `&`: 將工作丟到背景去執行。
* `jobs`: 觀察目前的背景工作狀態。
    * -l: 列出job number與指令外，同時列出PID。
    * -r: 僅列出背景正在run的工作。
    * -s: 僅列出正在背景當中暫停的工作。
    
* 將「目前」的工作丟到背景「暫停」:[ctrl]+z

* `fg`(foreground): 背景工作拿到前景處理。
    * fg %jobnumber  <= %可以省略。
    
* `bg`(background): 讓工作在背景下的狀態便運行中
    * bg %jobnumber。
    
* `kill`: 管理背景中的工作。
    *  kill -l: 列出目前kill能使用的signal有哪些。
    *  kill -signal %jobnumber
        *  -1: 重新讀取一次參數的設定檔。
        *  -2: 代表與鍵盤輸入[ctrl]+c有同樣的動作，就是通知程式停止。
        *  -9: "立刻"強制刪除一個工作。
        *  -15: 以"正常程序"終止一項工作，與-9不同。(預設值)
        *  -19: 相當[ctrl]+z暫停process。
        *  kill後面數字預設會是PID，如果想管理bash的工作控制需要加上%。
* `ps`: 程序的觀察
    * ps aux: 觀察系統所有程序資料。
    * ps -lA: 也是觀察系統所有程序的資料。
    * ps axjf: 連同部分程序樹狀態。
        * -A: 所有process均顯示出來。
        * -a: 不與terminal有關的所有process。   
        * -u: 有效使用者。
        * x : 通常與a這個參數一起使用，可以列出完整資料。
        * l : 較長較詳細。
        * j : 工作的格式。
        * -f: 做一個更為完整的輸出。
    * ps -l: 只能查自己的bash程序。

* `top`: 動態觀察程序的變化
    * top [-d 秒數] | top [-bnp]
        * -d: 後面接秒數，預設是5秒。
        * -b: 以批次執行top，通常搭配資料流重導向。
        * -h: 與-b搭，需要進行幾次的top的輸出結果。
        * -p: 指定某些個PID來進行觀察監測。
* `pstree`
    * -A: 個程序樹枝間的連接以ASCII字元來連結。
    * -U: 個程序樹之間以萬國碼字元來連結。
    * -p: 並同時列出每個process的PID。
    * -u: 並同時列出每個process的所屬帳號名稱。
*  `killall` 
    *  kill [iIe][command]
        *  -i: 互動模式。
        *  -e: excat的意思，表示要跟後面的command name一致。
        *  -I: 指令名稱(可能含參數)忽略大小寫。
* 程序的執行順序，只能調整nice值
    * 一開始執行程式就給予一個特定的nice值，用nice指令。
        * nice[-n 數字] command (nice範圍:-20~19)
    * 調整某個已經存在的PID的nice值，用renice指令。
        * renice [number] PID   
* `free`: 觀察記憶體使用的情況
    * -b  ：直接輸入 free 時，顯示的單位是 Kbytes，我們可以使用b(bytes)，m(Mbytes)
      k(Kbytes)，及 g(Gbytes) 來顯示單位。
    * -t  ：在輸出的最終結果，顯示實體記憶體與 swap 的總量。
    * -s  ：可以讓系統每幾秒鐘輸出一次。
* `uname` -a:所有系統相關的資訊。
* `uptime`: 觀察系統啟動時間與工作負載。
* `dmesg`: 分析核心產生的訊息。


