1. 程式人生 > >Linux Shell筆記

Linux Shell筆記

詳細 視頻 內核 profile 重復 用例 源碼 gzip linux中

命令

echo 打印

date[參數][-指定格式]

%t 跳格[Tab 鍵]
%H 小時(00~23)
%I 小時(00~12)
%M 分鐘(00~59)
%S 秒(00~59)
%j 今年中的第幾天

reboot poweroff

wget

-b 後臺下載模式
-P 下載到指定目錄
-t 最大嘗試次數
-c 斷點續傳
-p 下載頁面內所有資源,包括圖片、視頻等
-r 遞歸下載

ps 查看進程

用例 ps aux(不必使用-前綴)

-a 顯示所有進程(包括其他用戶的進程)
-u 用戶以及其他詳細信息
-x 顯示沒有控制終端的進程

top 監視系統

pidof [參數] [服務名稱]

kill [參數] [進程 PID]

killall [參數] [服務名稱]

ifconfig [網絡設備] [參數

uname [-a]

cat /etc/redhat-release

uptime 查看系統負載信息

free 顯示內存信息 free [-h]

who 查看當前登入主機的用戶終端信息

last 查看所有系統登入信息

history [-c] 顯示執行過的命令 /etc/profile 中 HISTSIZE為大小

sosreport 收集系統配置及架構信息並輸出診斷文檔

pwd 當前目錄

cd 切換目錄 -上一次的目錄,~家目錄

ls 顯示當前目錄文件信息,-a查看所有,-l查看屬性/大小,-d目錄屬性,用例ls -ld /etc

cat[選項] [文件] , -n顯示行號

more

head 前n頁 tail 後n頁(持續刷新) ,-f

tr[原始] [目標] 替換文本,用例cat anaconda-ks.cfg | tr [a-z] [A-Z]

wc word count,-l 行數,-w單詞數,-c字節數

stat 文件的具體存儲信息和時間等信息

cut[參數] 文本,提取文本字符 -f列數,-d間隔符號,用例cut -d: -f1 /etc/passwd

diff[參數] 文本,-c具體不同,--brief僅判斷

touch[選項] [文件],創建空白文件或設置文件的時間,-a修改atime,-m修改mtime,-d

都修改

mkdir[選項] 目錄,-p嵌套,用例mkdir -p a/b/c/d

cp[選項] 源 目標,-p保留屬性,-d保留鏈接屬性(?),-r遞歸,-i詢問覆蓋,-a等於-pdr

mv 剪切/重命名

rm 刪除,-f強制刪除.-r刪除目錄

dd,if輸入文件,of輸出,bs塊大小,count塊數量,用例dd if=/dev/zero of=560_file count=1 bs=560M

dd刻錄isodd if=/dev/cdrom of=RHEL-server-7.0-x86_64.iso

file查看文件類型

tar

-c 創建壓縮文件
-x 解開壓縮文件
-t 查看壓縮包內有哪些文件
-z 用 Gzip 壓縮或解壓
-j 用 bzip2 壓縮或解壓
-v 顯示壓縮或解壓的過程
-f 目標文件名
-p 保留原始的權限與屬性
-P 使用絕對路徑來壓縮
-C 指定解壓到的目錄

一般用-czvfxzvf

示例tar -czvf etc.tar.gz /etc.mkdir /root/etc,tar xzvf etc.tar.gz -C /root/etc

grep 關鍵詞搜索

-b 將可執行文件(binary)當作文本文件(text)來搜索
-c 僅顯示找到的行數
-i 忽略大小寫
-n 顯示行號
-v 反向選擇—僅列出沒有“關鍵詞”的行

小知識

Linux中的進程分為5個狀態,

R(運行) 進程正在運行或在運行隊列中等待

S(中斷) 進程處於休眠中,當某個條件形成後或者接收到信號時,則脫離該狀態。

D(不可中斷) 進程不響應系統異步信號,即便用 kill 命令也不能將其中斷

Z(僵死), 進程已經終止,但進程描述符依然存在, 直到父進程調用 wait4()系統函數後將進程釋放

T(停止) 進程收到停止信號後停止運行

輸入重定向符號

命令 < 文件

命令 << 分界符 從STDIN讀入,直到遇到分界符停止

命令 < 文件1 > 文件2

輸出重定向符號

命令 > 文件

命令 2> 文件 STDERR

命令 >> 文件 追加模式

命令 2>> 文件 追加

命令 >> 文件 2>&1 或者 命令 &>> 文件 STDOUT和STDERR追加到同一文件

其中描述符 0 是STDIN 1是STDOUT 2是STDERR

管道命令符|a|b作用為把前一個命令當作是後一個命令的標準輸入

通配符*表示0個或多個,?匹配單個,[0-9]匹配0-9之間的單個數,可用於文件操作

轉義字符\後面一個變量變為字符串,"所有變量變為字符串,""保留變量屬性不專義,``執行命令並返回

last update:2019/02/13

以下為The Linux Command Line筆記

ls命令有兩個選項,“l”選項產生長格式輸出,“t”選項按文件 修改時間的先後來排序。

加上長選項 “–reverse”,則結果會以相反的順序輸出

[[email protected] ~]$ ls -lt --reverse

ls 命令有大量的選項。表4-1列出了最常使用的選項。
表 4-1: ls 命令選項

選項 長選項 描述
-a --all 列出所有文件,甚至包括文件名以圓點開頭的默認會被隱藏的隱藏文件。
-d --directory 通常,如果指定了目錄名,ls 命令會列出這個目錄中的內容,而不是目錄本身。 把這 個選項與 -l 選項結合使用,可以看到所指定目錄的詳細信息,而不是目錄中的內容。
-F --classify 這個選項會在每個所列出的名字後面加上一個指示符。例如,如果名字是 目錄名,則會 加上一個‘/‘字符。
-h --human-readable 當以長格式列出時,以人們可讀的格式,而不是以字節數來顯示文件的大小。
-l 以長格式顯示結果。
-r --reverse 以相反的順序來顯示結果。通常,ls 命令的輸出結果按照字母升序排列。
-S 命令輸出結果按照文件大小來排序。
-t 按照修改時間來排序。

-rw-r--r-- 1 root root 32059 2007-04-03 11:05 oo-cd-cover.odf

字段 含義
-rw-r--r-- 對於文件的訪問權限。第一個字符指明文件類型。在不同類型之間, 開頭的“-”說明是一 個普通文件,“d”表明是一個目錄。其後三個字符是文件所有者的 訪問權限,再其後的三個字符是文件 所屬組中成員的訪問權限,最後三個字符是其他所 有人的訪問權限。這個字段的完整含義將在第十章討 論。
1 文件的硬鏈接數目。參考隨後討論的關於鏈接的內容。
root 文件屬主的用戶名。
root 文件所屬用戶組的名字。
32059 以字節數表示的文件大小。
2007-04-03 11:05 上次修改文件的時間和日期。
oo-cd-cover.odf 文件名。

file picture.jpg picture.jpg: JPEG image data, JFIF standard 1.01

less 命令是一個用來瀏覽文本文件的程序。less filename

命令 行為
Page UP or b 向上翻滾一頁
Page Down or space 向下翻滾一頁
UP Arrow 向上翻滾一行
Down Arrow 向下翻滾一行
G 移動到最後一行
1G or g 移動到開頭一行
/charaters 向前查找指定的字符串
n 向前查找下一個出現的字符串,這個字符串是之前所指定查找的
h 顯示幫助屏幕
q 退出 less 程序

表 4-4: Linux 系統中的目錄
| 目錄 | 評論 |
|-----|---------|
| / | 根目錄,萬物起源。 |
| /bin | 包含系統啟動和運行所必須的二進制程序。 |
| /boot | 包含 Linux 內核,最初的 RMA 磁盤映像(系統啟動時,由驅動程序所需),和 啟動加載程序。有趣的文件: /boot/grub/grub.conf or menu.lst, 被用來配置啟動加載程序。 /boot/vmlinuz,Linux 內核。 |
| /dev | 這是一個包含設備結點的特殊目錄。“一切都是文件”,也使用於設備。 在這個目錄裏,內核維護著它支持的設備。 |
| /etc | 這個目錄包含所有系統層面的配置文件。它也包含一系列的 shell 腳本, 在系統啟動時,這些腳本會運行每個系統服務。這個目錄中的任何文件應該是可讀的文本文件。有意思的文件:雖然/etc 目錄中的任何文件都有趣,但這裏只列出了一些我一直喜歡的文件: /etc/crontab, 定義自動運行的任務。 /etc/fstab,包含存儲設備的列表,以及與他們相關的掛載點。/etc/passwd,包含用戶帳號列表。 |
| /home | 在通常的配置環境下,系統會在/home 下,給每個用戶分配一個目錄。普通只能 在他們自己的目錄下創建文件。這個限制保護系統免受錯誤的用戶活動破壞。 |
| /lib | 包含核心系統程序所需的庫文件。這些文件與 Windows 中的動態鏈接庫相似。 |
| /lost+found | 每個使用 Linux 文件系統的格式化分區或設備,例如 ext3文件系統, 都會有這個目錄。當部分恢復一個損壞的文件系統時,會用到這個目錄。除非文件系統 真正的損壞了,那麽這個目錄會是個空目錄。 |
| /media | 在現在的 Linux 系統中,/media 目錄會包含可移除媒體設備的掛載點, 例如 USB 驅動器,CD-ROMs 等等。這些設備連接到計算機之後,會自動地掛載到這個目錄結點下。 |
| /mnt | 在早些的 Linux 系統中,/mnt 目錄包含可移除設備的掛載點。 |
| /opt | 這個/opt 目錄被用來安裝“可選的”軟件。這個主要用來存儲可能 安裝在系統中的商業軟件產品。 |
| /proc | 這個/proc 目錄很特殊。從存儲在硬盤上的文件的意義上說,它不是真正的文件系統。 反而,它是一個由 Linux 內核維護的虛擬文件系統。它所包含的文件是內核的窺視孔。這些文件是可讀的, 它們會告訴你內核是怎樣監管計算機的。 |
| /root | root 帳戶的家目錄。 |
| /sbin | 這個目錄包含“系統”二進制文件。它們是完成重大系統任務的程序,通常為超級用戶保留。 |
| /tmp | 這個/tmp 目錄,是用來存儲由各種程序創建的臨時文件的地方。一些配置,導致系統每次 重新啟動時,都會清空這個目錄。 |
| /usr | 在 Linux 系統中,/usr 目錄可能是最大的一個。它包含普通用戶所需要的所有程序和文件。 |
| /usr/bin | /usr/bin 目錄包含系統安裝的可執行程序。通常,這個目錄會包含許多程序。 |
| /usr/lib | 包含由/usr/bin 目錄中的程序所用的共享庫。 |
| /usr/local | 這個/usr/local 目錄,是非系統發行版自帶,卻打算讓系統使用的程序的安裝目錄。 通常,由源碼編譯的程序會安裝在/usr/local/bin 目錄下。新安裝的 Linux 系統中,會存在這個目錄, 但卻是空目錄,直到系統管理員放些東西到它裏面。 |
| /usr/sbin | 包含許多系統管理程序。 |
| /usr/share | /usr/share 目錄包含許多由/usr/bin 目錄中的程序使用的共享數據。 其中包括像默認的配置文件,圖標,桌面背景,音頻文件等等。 |
| /usr/share/doc | 大多數安裝在系統中的軟件包會包含一些文檔。在/usr/share/doc 目錄下, 我們可以找到按照軟件包分類的文檔。 |
| /var | 除了/tmp 和/home 目錄之外,相對來說,目前我們看到的目錄是靜態的,這是說, 它們的內容不會改變。/var 目錄是可能需要改動的文件存儲的地方。各種數據庫,假脫機文件, 用戶郵件等等,都駐紮在這裏。 |
| /var/log | 這個/var/log 目錄包含日誌文件,各種系統活動的記錄。這些文件非常重要,並且 應該時時監測它們。其中最重要的一個文件是/var/log/messages。註意,為了系統安全,在一些系統中, 你必須是超級用戶才能查看這些日誌文件。 |

完整的 Linux 文件系統層次體系標準可通過以下鏈接找到:

http://www.pathname.com/fhs/

Q.什麽是軟鏈接/硬鏈接

操作文件和目錄

  • cp — 復制文件和目錄
  • mv — 移動/重命名文件和目錄
  • mkdir — 創建目錄
  • rm — 刪除文件和目錄
  • ln — 創建硬鏈接和符號鏈接

通配符

通配符 意義
* 匹配任意多個字符(包括零個或一個)
? 匹配任意一個字符(不包括零個)
[characters] 匹配任意一個屬於字符集中的字符
[!characters] 匹配任意一個不是字符集中的字符
[[:class:]] 匹配任意一個屬於指定字符類中的字符

表5-2: 普遍使用的字符類

字符類 意義
[:alnum:] 匹配任意一個字母或數字
[:alpha:] 匹配任意一個字母
[:digit:] 匹配任意一個數字
[:lower:] 匹配任意一個小寫字母
[:upper] 匹配任意一個大寫字母

mkdir directory...(可重復,如mkdir dir1 dir2 dir3)

cp item1 item2cp item... directory

表5-4: cp 選項
| 選項 | 意義 |
|--------|-------|
| -a, --archive | 復制文件和目錄,以及它們的屬性,包括所有權和權限。 通常,復本具有用戶所操作文件的默認屬性。 |
| -i, --interactive | 在重寫已存在文件之前,提示用戶確認。如果這個選項不指定, cp 命令會默認重寫文件。 |
| -r, --recursive | 遞歸地復制目錄及目錄中的內容。當復制目錄時, 需要這個選項(或者-a 選項)。 |
| -u, --update | 當把文件從一個目錄復制到另一個目錄時,僅復制 目標目錄中不存在的文件,或者是文件內容新於目標目錄中已經存在的文件。 |
| -v, --verbose | 顯示翔實的命令操作信息 |
表5-5: cp 實例
| 命令 | 運行結果 |
|--------|-------|
| cp file1 file2 | 復制文件 file1 內容到文件 file2。如果 file2 已經存在, file2 的內容會被 file1 的內容重寫。如果 file2 不存在,則會創建 file2。 |
| cp -i file1 file2 | 這條命令和上面的命令一樣,除了如果文件 file2 存在的話,在文件 file2 被重寫之前, 會提示用戶確認信息。 |
| cp file1 file2 dir1 | 復制文件 file1 和文件 file2 到目錄 dir1。目錄 dir1 必須存在。 |
| cp dir1/* dir2 | 使用一個通配符,在目錄 dir1 中的所有文件都被復制到目錄 dir2 中。 dir2 必須已經存在。 |
| cp -r dir1 dir2 | 復制目錄 dir1 中的內容到目錄dir2。如果目錄 dir2 不存在, 創建目錄 dir2,操作完成後,目錄 dir2 中的內容和 dir1 中的一樣。 如果目錄 dir2 存在,則目錄 dir1 (和目錄中的內容)將會被復制到 dir2 中。 |

mv item1 item2mv item... directory

表5-6: mv 選項
| 選項 | 意義 |
|--------|-------|
| -i --interactive | 在重寫一個已經存在的文件之前,提示用戶確認信息。 如果不指定這個選項,mv 命令會默認重寫文件內容。 |
| -u --update | 當把文件從一個目錄移動另一個目錄時,只是移動不存在的文件, 或者文件內容新於目標目錄相對應文件的內容。 |
| -v --verbose | 當操作 mv 命令時,顯示翔實的操作信息。 |
表5-7: mv 實例
|||
|--------|-------|
| mv file1 file2 | 移動 file1 到 file2。如果 file2 存在,它的內容會被 file1 的內容重寫。 如果 file2 不存在,則創建 file2。 每種情況下,file1 不再存在。 |
| mv -i file1 file2 | 除了如果 file2 存在的話,在 file2 被重寫之前,用戶會得到 提示信息外,這個和上面的選項一樣。 |
| mv file1 file2 dir1 | 移動 file1 和 file2 到目錄 dir1 中。dir1 必須已經存在。 |
| mv dir1 dir2 | 如果目錄 dir2 不存在,創建目錄 dir2,並且移動目錄 dir1 的內容到 目錄 dir2 中,同時刪除目錄 dir1。如果目錄 dir2 存在,移動目錄 dir1(及它的內容)到目錄 dir2。 |

rm item...

表5-8: rm 選項
| 選項 | 意義 |
|--------|-------|
| -i, --interactive | 在刪除已存在的文件前,提示用戶確認信息。 如果不指定這個選項,rm 會默默地刪除文件 |
| -r, --recursive | 遞歸地刪除文件,這意味著,如果要刪除一個目錄,而此目錄 又包含子目錄,那麽子目錄也會被刪除。要刪除一個目錄,必須指定這個選項。 |
| -f, --force | 忽視不存在的文件,不顯示提示信息。這選項顛覆了“--interactive”選項。 |
| -v, --verbose | 在執行 rm 命令時,顯示翔實的操作信息。 |
表5-9: rm 實例
| 命令 | 運行結果 |
|--------|-------|
| rm file1 | 默默地刪除文件 |
| rm -i file1 | 除了在刪除文件之前,提示用戶確認信息之外,和上面的命令作用一樣。 |
| rm -r file1 dir1 | 刪除文件 file1, 目錄 dir1,及 dir1 中的內容。 |
| rm -rf file1 dir1 | 同上,除了如果文件 file1,或目錄 dir1 不存在的話,rm 仍會繼續執行。 |

小貼士。 無論什麽時候,rm 命令用到通配符(除了仔細檢查輸入的內容外!), 用 ls 命令來測試通配符。這會讓你看到要刪除的文件列表。然後按下上箭頭按鍵,重新調用 剛剛執行的命令,用 rm 替換 ls。

ln file link

  • type – 說明怎樣解釋一個命令名
  • which – 顯示會執行哪個可執行程序
  • man – 顯示命令手冊頁
  • apropos – 顯示一系列適合的命令
  • info – 顯示命令 info
  • whatis – 顯示一個命令的簡潔描述
  • alias – 創建命令別名

type command

[[email protected] ~]$ type type
type is a shell builtins
[[email protected] ~]$ type ls
ls is aliased to `ls --color=tty`
[[email protected] ~]$ type cp
cp is /bin/cp
[[email protected] ~]$ which ls
/bin/ls

註意which只對可執行程序有效

cd [-L|-P] [dir]

(一個豎杠字符 表示互斥選項)

重定向

  • cat - 連接文件
  • sort - 排序文本行
  • uniq - 報道或省略重復行
  • grep - 打印匹配行
  • wc - 打印文件中換行符,字,和字節個數
  • head - 輸出文件第一部分
  • tail - 輸出文件最後一部分

事實上,如果我們需要刪除一個文件內容(或者創建一個 新的空文件),可以使用這樣的技巧:

[[email protected] ~]$ > ls-output.txt

怎樣才能把重定向結果追加到文件內容後面,而不是從開頭重寫文件?為了這個目的, 我們使用>>重定向符

[[email protected] ~]$ ls -l /bin/usr > ls-output.txt 2>&1

使用這種方法,我們完成兩個重定向

重定向文件描述符2(標準錯誤)到文件描述符1(標準輸出)使用表示法2>&1。

現在的 bash 版本提供了第二種方法,更精簡合理的方法來執行這種聯合的重定向。

[[email protected] ~]$ ls -l /bin/usr &> ls-output.txt

在這個例子裏面,我們使用單單一個表示法 &> 來重定向標準輸出和錯誤到文件 ls-output.txt

通過重定向輸出結果 到一個特殊的叫做”/dev/null”的文件。這個文件是系統設備,叫做位存儲桶,它可以 接受輸入,並且對輸入不做任何處理。為了隱瞞命令錯誤信息,我們這樣做:

[[email protected] ~]$ ls -l /bin/usr 2> /dev/null

cat 命令讀取一個或多個文件,然後復制它們到標準輸出

cat [file]

你可以使用 cat 來顯示 文件而沒有分頁,例如:

[[email protected] ~]$ cat ls-output.txt

將會顯示文件 ls-output.txt 的內容。cat 經常被用來顯示簡短的文本文件

我們能用這個命令把它們連接起來:

cat movie.mpeg.0* > movie.mpeg

因為通配符總是以有序的方式展開,所以這些參數會以正確順序安排。

如果 cat 沒有給出任何參數,它會從標準輸入讀入數據,因為標準輸入,默認情況下,連接到鍵盤。

[[email protected] ~]$ cat > lazy_dog.txt
The quick brown fox jumped over the lazy dog.
^d

使用“<”重定向操作符,我們把標準輸入源從鍵盤改到文件 lazy_dog.tx。我們看到結果 和傳遞單個文件名作為參數的執行結果一樣(cat lazy_dog.txt)

[[email protected] ~]$ cat < lazy_dog.txt
The quick brown fox jumped over the lazy dog.

命令可以從標準輸入讀取數據,然後再把數據輸送到標準輸出,命令的這種能力被 一個 shell 特性所利用,這個特性叫做管道線|

一個命令的 標準輸出可以管道到另一個命令的標準輸入:

command1 | command2

我們用 less 來一頁一頁地顯示任何命令的輸出,命令把 它的運行結果輸送到標準輸出:

[[email protected] ~]$ ls -l /usr/bin | less

想象一下,我們想把目錄/bin 和/usr/bin 中 的可執行程序都聯合在一起,再把它們排序,然後瀏覽執行結果:

[[email protected] ~]$ ls /bin /usr/bin | sort | less

為了確信 我們的列表中不包含重復句子(這是說,出現在目錄/bin 和/usr/bin 中重名的程序),我們添加 uniq 到我們的管道線中:

[[email protected] ~]$ ls /bin /usr/bin | sort | uniq | less

如果我們想看到重復的數據列表,讓 uniq 命令帶上”-d”選項,就像這樣:

[[email protected] ~]$ ls /bin /usr/bin | sort | uniq -d | less

如果 wc 不帶命令行參數,它接受標準輸入。”-l”選項限制命令輸出只能 報道行數。添加 wc 到管道線來統計數據,是個很便利的方法。查看我們的有序列表中程序個數, 我們可以這樣做:

[[email protected] ~]$ ls /bin /usr/bin | sort | uniq | wc -l
2728

grep 是個很強大的程序,用來找到文件中的匹配文本。這樣使用 grep 命令:

grep pattern [file...]

當 grep 遇到一個文件中的匹配”模式”,它會打印出包含這個類型的行

我們想在我們的程序列表中,找到文件名中包含單詞”zip”的所有文件

[[email protected] ~]$ ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
gunzip
...

-i導致 grep 忽略大小寫當執行搜索時(通常,搜索是大小寫 敏感的)

-v選項會告訴 grep 只打印不匹配的行

head / tail - 打印文件開頭部分/結尾部分,兩個命令都打印十行文本,但是可以通過”-n”選項來調整命令打印的行數。

[[email protected] ~]$ head -n 5 ls-output.txt
total 343496
...
[[email protected] ~]$ tail -n 5 ls-output.txt
...
[[email protected] ~]$ ls /usr/bin | tail -n 5
znew
...

使用-f選項,tail 命令繼續監測這個文件,當新的內容添加到文件後,它們會立即 出現在屏幕上。這會一直繼續下去直到你輸入 Ctrl-c

tee - 從 Stdin 讀取數據,並同時輸出到 Stdout 和文件

在 grep 過濾管道線的內容之前,來捕捉整個目錄列表到文件 ls.txt

[[email protected] ~]$ ls /usr/bin | tee ls.txt | grep zip
bunzip2
bzip2
....

shell特技

shell 把“*”展開成了 另外的東西,在 echo 命令被執行前。當回車鍵被按下時,shell 在命令被執行前在命令行上自動展開任何符合條件的字符, 所以 echo 命令從不會發現“*”,只把它展開成結果,這種通配符工作機制叫做路徑名展開

[[email protected] ~]$ echo *
Desktop Documents ls-output.txt Music Pictures Public Templates Videos

給出一個家目錄,它看起來像這樣

[[email protected] ~]$ ls
Desktop   ls-output.txt   Pictures   Templates
....

我們能夠執行以下參數展開模式:

[[email protected] ~]$ echo D*
Desktop  Documents

和:

[[email protected] ~]$ echo *s
Documents Pictures Templates Videos

甚至是:

[[email protected] ~]$ echo [[:upper:]]*
Desktop Documents Music Pictures Public Templates Videos

波浪號展開:

如果有用戶”foo”這個帳號,然後:

[[email protected] ~]$ echo ~foo
/home/foo

算術表達式只支持整數(全部是數字,不帶小數點),但是能執行很多不同的操作。這裏是 一些它支持的操作符:
表 8-1: 算術操作符

操作符 說明
+
-
*
/ 除(但是記住,因為展開只是支持整數除法,所以結果是整數。)
% 取余,只是簡單的意味著,“余數”
** 取冪

花括號展開

[[email protected] ~]$ mkdir Pics
[[email protected] ~]$ cd Pics
[[email protected] Pics]$ mkdir {2007..2009}-0{1..9} {2007..2009}-{10..12}
[[email protected] Pics]$ ls
2007-01 2007-07 2008-01 2008-07 2009-01 2009-07
2007-02 2007-08 2008-02 2008-08 2009-02 2009-08
2007-03 2007-09 2008-03 2008-09 2009-03 2009-09
2007-04 2007-10 2008-04 2008-10 2009-04 2009-10
2007-05 2007-11 2008-05 2008-11 2009-05 2009-11
2007-06 2007-12 2008-06 2008-12 2009-06 2009-12

參數展開$

查看有效的變量列表,試試這個:

[[email protected] ~]$ printenv | less

命令替換

[[email protected] ~]$ ls -l $(which cp)
-rwxr-xr-x 1 root root 71516 2007-12-05 08:58 /bin/cp

這裏我們把 which cp 的執行結果作為一個參數傳遞給 ls 命令,因此要想得到 cp 程序的 輸出列表,不必知道它完整的路徑名

我們不只限制於簡單命令。也可以使用整個管道線 (只展示部分輸出):

[[email protected] ~]$ file $(ls /usr/bin/* | grep zip)
/usr/bin/bunzip2:     symbolic link to `bzip2'
....

單詞分割機制會導致這個文件名被看作兩個獨自的參數,而不是所期望 的單個參數:

[[email protected] ~]$ ls -l two words.txt
ls: cannot access two: No such file or directory
ls: cannot access words.txt: No such file or directory

使用雙引號,我們可以阻止單詞分割,得到期望的結果;進一步,我們甚至可以修復 破損的文件名。

[[email protected] ~]$ ls -l "two words.txt"
-rw-rw-r-- 1 me   me   18 2008-02-20 13:03 two words.txt
[[email protected] ~]$ mv "two words.txt" two_words.txt

鍵盤操作

clear - 清空屏幕

history - 顯示歷史列表內容

表9-1: 光標移動命令
| 按鍵 | 行動 |
|--------|-------|
| Ctrl-a | 移動光標到行首。 |
| Ctrl-e | 移動光標到行尾。 |
| Ctrl-f | 光標前移一個字符;和右箭頭作用一樣。 |
| Ctrl-b | 光標後移一個字符;和左箭頭作用一樣。 |
| Alt-f | 光標前移一個字。 |
| Alt-b | 光標後移一個字。 |
| Ctrl-l | 清空屏幕,移動光標到左上角。clear 命令完成同樣的工作。 |

表9-2: 文本編輯命令
| 按鍵 | 行動 |
|--------|-------|
| Ctrl-d | 刪除光標位置的字符。 |
| Ctrl-t | 光標位置的字符和光標前面的字符互換位置。 |
| Alt-t | 光標位置的字和其前面的字互換位置。 |
| Alt-l | 把從光標位置到字尾的字符轉換成小寫字母。 |
| Alt-u | 把從光標位置到字尾的字符轉換成大寫字母。 |

剪切下來的本文被存儲在一個叫做剪切環(kill-ring)的緩沖區中

表9-3: 剪切和粘貼命令

按鍵 行動
Ctrl-k 剪切從光標位置到行尾的文本。
Ctrl-u 剪切從光標位置到行首的文本。
Alt-d 剪切從光標位置到詞尾的文本。
Alt-Backspace 剪切從光標位置到詞頭的文本。如果光標在一個單詞的開頭,剪切前一個單詞。
Ctrl-y 把剪切環中的文本粘貼到光標位置。

表9-4: 自動補全命令
| 按鍵 | 行動 |
|--------|-------|
| Alt-? | 顯示可能的自動補全列表。在大多數系統中,你也可以完成這個通過按 兩次 tab 鍵,這會更容易些。 |
| Alt-* | 插入所有可能的自動補全。當你想要使用多個可能的匹配項時,這個很有幫助。 |

歷史操作

我們想要找到列出目錄 /usr/bin 內容的命令。一種方法,我們可以這樣做:

[[email protected] ~]$ history | grep /usr/bin

我們的搜索結果之中,我們得到一行,包含了有趣的命令,像這樣;

88  ls -l /usr/bin > ls-output.txt

數字 “88” 是這個命令在歷史列表中的行號。隨後在使用另一種展開類型時,叫做 歷史命令展開,我們會用到這個數字。我們可以這樣做,來使用我們所發現的行:

[[email protected] ~]$ !88

bash 會把 “!88” 展開成為歷史列表中88行的內容。

權限

  • id – 顯示用戶身份號
  • chmod – 更改文件模式
  • umask – 設置默認的文件權限
  • su – 以另一個用戶的身份來運行 shell
  • sudo – 以另一個用戶的身份來執行命令
  • chown – 更改文件所有者
  • chgrp – 更改文件組所有權
  • passwd – 更改用戶密碼

表10-1: 文件類型
| 屬性 | 文件類型 |
| ---- | ------------------------------------------------------------ |
| - | 一個普通文件 |
| d | 一個目錄 |
| l | 一個符號鏈接。註意對於符號鏈接文件,剩余的文件屬性總是"rwxrwxrwx",而且都是 虛擬值。真正的文件屬性是指符號鏈接所指向的文件的屬性。 |
| c | 一個字符設備文件。這種文件類型是指按照字節流,來處理數據的設備。 比如說終端機,或者調制解調器 |
| b | 一個塊設備文件。這種文件類型是指按照數據塊,來處理數據的設備,例如一個硬盤,或者 CD-ROM 盤。 |

表10-4: chmod 命令符號表示法
|||
|-----|-----------|
| u | "user"的簡寫,意思是文件或目錄的所有者。|
| g | 用戶組。 |
| o | "others"的簡寫,意思是其他所有的人。 |
| a | "all"的簡寫,是"u", "g"和“o”三者的聯合。 |

如果沒有指定字符,則假定使用”all”。執行的操作可能是一個“+”字符,表示加上一個權限, 一個“-”,表示刪掉一個權限,或者是一個“=”,表示只有指定的權限可用,其它所有的權限被刪除。

權限由 “r”,“w”,和 “x” 來指定。這裏是一些符號表示法的實例:

表10-5: chmod 符號表示法實例
|||
|-----|-----------|
| u+x | 為文件所有者添加可執行權限。 |
| u-x | 刪除文件所有者的可執行權限。 |
| +x | 為文件所有者,用戶組,和其他所有人添加可執行權限。 等價於 a+x。 |
| o-rw | 除了文件所有者和用戶組,刪除其他人的讀權限和寫權限。 |
| go=rw | 給群組的主人和任意文件擁有者的人讀寫權限。如果群組的主人或全局之前已經有了執行的權限,他們將被移除。 |
| u+x,go=rw | 給文件擁有者執行權限並給組和其他人讀和執行的權限。多種設定可以用逗號分開。 |

進程

  • ps – 報告當前進程快照
  • top – 顯示任務
  • jobs – 列出活躍的任務
  • bg – 把一個任務放到後臺執行
  • fg – 把一個任務放到前臺執行
  • kill – 給一個進程發送信號
  • killall – 殺死指定名字的進程
  • shutdown – 關機或重啟系統

默認情況下,ps 不會顯示很多進程信息,只是列出與當前終端會話相關的進程

[[email protected] ~]$ ps
PID TTY           TIME CMD
5198 pts/1    00:00:00 bash
10129 pts/1   00:00:00 ps

TTY 是 “Teletype” 的簡寫,是指進程的控制終端。這裏,Unix 展示它的年齡。TIME 字段表示 進程所消耗的 CPU 時間數量。

表11-1: 進程狀態
| 狀態 | 意義 |
| --- | --- |
| R | 運行。這意味著,進程正在運行或準備運行。 |
| S | 正在睡眠。 進程沒有運行,而是,正在等待一個事件, 比如說,一個按鍵或者網絡數據包。 |
| D | 不可中斷睡眠。進程正在等待 I/O,比方說,一個磁盤驅動器的 I/O。 |
| T | 已停止. 已經指示進程停止運行。稍後介紹更多。 |
| Z | 一個死進程或“僵屍”進程。這是一個已經終止的子進程,但是它的父進程還沒有清空它。 (父進程沒有把子進程從進程表中刪除) |
| < | 一個高優先級進程。這可能會授予一個進程更多重要的資源,給它更多的 CPU 時間。 進程的這種屬性叫做 niceness。具有高優先級的進程據說是不好的(less nice), 因為它占用了比較多的 CPU 時間,這樣就給其它進程留下很少時間。 |
| N | 低優先級進程。 一個低優先級進程(一個“好”進程)只有當其它高優先級進程執行之後,才會得到處理器時間。 |

表11-2: BSD 風格的 ps 命令列標題
| 標題 | 意思 |
| --- | --- |
| USER | 用戶 ID. 進程的所有者。 |
| %CPU | 以百分比表示的 CPU 使用率 |
| %MEM | 以百分比表示的內存使用率 |
| VSZ | 虛擬內存大小 |
| RSS | 進程占用的物理內存的大小,以千字節為單位。 |
| START | 進程運行的起始時間。若超過24小時,則用天表示。 |

為了看到更多動態的信息,我們使用 top 命令。top 程序連續顯示系統進程更新的信息(默認情況下,每三分鐘更新一次)

表11-3: top 命令信息字段
| 行號 | 字段 | 意義 |
| --- | --- | --- |
| 1 | top | 程序名。 |
| | 14:59:20 |當前時間。|
| | up 6:30 |這是正常運行時間。它是計算機從上次啟動到現在所運行的時間。 在這個例子裏,系統已經運行了六個半小時。|
| | 2 users |有兩個用戶登錄系統。|
| | load average: |加載平均值是指,等待運行的進程數目,也就是說,處於運行狀態的進程個數, 這些進程共享 CPU。展示了三個數值,每個數值對應不同的時間周期。第一個是最後60秒的平均值, 下一個是前5分鐘的平均值,最後一個是前15分鐘的平均值。若平均值低於1.0,則指示計算機 工作不忙碌。|
| 2 | Tasks: | 總結了進程數目和各種進程狀態。 |
| 3 | Cpu(s): | 這一行描述了 CPU 正在執行的進程的特性。 |
| | 0.7%us |0.7% of the CPU is being used for user processes.這意味著進程在內核之外。|
| | 1.0%sy |1.0%的 CPU 時間被用於系統(內核)進程。|
| | 0.0%ni |0.0%的 CPU 時間被用於"nice"(低優先級)進程。|
| | 98.3%id |98.3%的 CPU 時間是空閑的。|
| | 0.0%wa |0.0%的 CPU 時間來等待 I/O。|
| 4 | Mem: | 展示物理內存的使用情況。 |
| 5 | Swap: | 展示交換分區(虛擬內存)的使用情況。 |

控制進程暫留

shell環境

  • printenv - 打印部分或所有的環境變量
  • set - 設置 shell 選項
  • export — 導出環境變量,讓隨後執行的程序知道。
  • alias - 創建命令別名

VI

表13-1: 光標移動按鍵
| 按鍵 | 移動光標 |
| ------------------- | -------------------------------------- |
| l or 右箭頭 | 向右移動一個字符 |
| h or 左箭頭 | 向左移動一個字符 |
| j or 下箭頭 | 向下移動一行 |
| k or 上箭頭 | 向上移動一行 |
| 0 (零按鍵) | 移動到當前行的行首。 |
| ^ | 移動到當前行的第一個非空字符。 |
| $ | 移動到當前行的末尾。 |
| w | 移動到下一個單詞或標點符號的開頭。 |
| W | 移動到下一個單詞的開頭,忽略標點符號。 |
| b | 移動到上一個單詞或標點符號的開頭。 |
| B | 移動到上一個單詞的開頭,忽略標點符號。 |
| Ctrl-f or Page Down | 向下翻一頁 |
| Ctrl-b or Page Up | 向上翻一頁 |
| numberG | 移動到第 number 行。例如,1G 移動到文件的第一行。 |
| G | 移動到文件末尾。 |

vi 中的許多命令都可以在前面加上一個數字,比方說上面提到的”G”命令。在命令之前加上一個 數字,我們就可以指定命令執行的次數。例如,命令”5j”導致 vi 向下移動5行。

u撤回

a追加

A

表13-2: 文本行打開按鍵
| 命令 | 打開行 |
|-------|---------|
| o | 當前行的下方打開一行。 |
| O | 當前行的上方打開一行。 |

表13-3: 文本刪除命令
| 命令 | 刪除的文本 |
|-------|---------|
| x | 當前字符 |
| 3x | 當前字符及其後的兩個字符。 |
| dd | 當前行。 |
| 5dd | 當前行及隨後的四行文本。 |
| dW | 從光標位置開始到下一個單詞的開頭。 |
| d$ | 從光標位置開始到當前行的行尾。 |
| d0 | 從光標位置開始到當前行的行首。 |
| d^ | 從光標位置開始到文本行的第一個非空字符。 |
| dG | 從當前行到文件的末尾。 |
| d20G | 從當前行到文件的第20行。 |

表13-4: 復制命令
| 命令 | 復制的內容 |
|-------|---------|
| yy | 當前行。 |
| 5yy | 當前行及隨後的四行文本。 |
| yW | 從當前光標位置到下一個單詞的開頭。 |
| y$ | 從當前光標位置到當前行的末尾。 |
| y0 | 從當前光標位置到行首。 |
| y^ | 從當前光標位置到文本行的第一個非空字符。 |
| yG | 從當前行到文件末尾。 |
| y20G | 從當前行到文件的第20行。 |

J連接行

f 命令查找一行,移動光標到下一個所指定的字符上。例如,命令 fa 會把光標定位到同一行中 下一個出現的”a”字符上。在一行中執行了字符的查找命令之後,通過輸入分號來重復這個查找。

目前進度30%

Linux Shell筆記