Yunduan CUIgraphical user interfaces make easy tasks easy, while command line interfaces make difficult tasks possiblePart 1 學習Shell1. 什麼是 Shell?Shell...
Yunduan CUI
graphical user interfaces make easy tasks easy, while command line interfaces make difficult tasks possible
Part 1 學習Shell
1. 什麼是 Shell?
Shell 是用戶與操作系統交流的程式,它讀取用戶的鍵盤輸入並交由操作系統執行相應的命令。所有linux都支持一個叫做 bash 的shell,它的全稱是 “Bourne Again SHell”,bash 的前身是由 Steve Bourne 寫的sh。
當我們使用Shell的時候,我們實際上需要另一個叫做 terminal emulator 的程式與shell進行交互,也就是我們常見的一個叫做終端的程式。(終端可以選擇不同的Shell)
2. 巡航
巡航linux的文件系統,常用命令為:
- ls:顯示當前工作目錄的文件
- cd: 更改工作目錄
- pwd:顯示當前工作目錄名稱
linux使用一個基於樹德文件系統。不同於windows把每一個磁碟都看做是獨立的文件系統,linux 總是保持一個文件系統。
在使用cd命令時,cd 直接返回預設目錄,cd ~user_name 返回對應用戶的預設目錄,cd - 返回之前的目錄。另外 . 表示當前目錄,..表示父目錄
使用ls命令時預設是不顯示隱藏文件的,要顯示它們 使用 ls -a
3. 探索文件
使用ls的更多技巧,ls支持顯示指定文件夾內容,也支持顯示兩個文件夾的內容。使用 ls -l 可以顯示文件的長格式。-t 可以按照更改時間對文件進行排序。其他比較有用的選項:
* -F 特別標註/在文件夾名後 -r 反向用字母表顯示 -S 以文件大小排序 -t 以更改時間排序
關於文件的長格式
其中第一列 是文件訪問許可權 第一個字母:- 代表常規文件 d 代表文件夾 l 代表連接文件 接下來三個字母是對文件擁有者的許可權 再接下來三個字母是對同組成員的許可權,最後三個是對所有人的許可權 r代表讀 w代表寫 x代表執行 第二列表示文件個數(對於文件夾,文件的話自然是1) 第三列表示擁有者 第四列表示屬於的組 第五列表示文件大小(bytes) 第六列是創建日期 第七列是文件名
確定文件類型
使用 file 命令確定文件類型
讀取文件內容
使用 less 命令讀取文件內容, 進入內容後的操作如下:
Page Up/b 前滾一頁
Page Down/空格 後滾一頁
上/下箭頭 前滾/後滾一行
G 移動到文件尾
1G/g 移動到文件頭
/【characters】 前向查找【characters】
n 找到下一個查找目標
h 顯示幫助
q 退出
less 的前身叫做 more,之所以取這個看起來相反的名字是因為 Less is more
介紹文件系統
目錄名 | 介紹 |
---|---|
/ | 根目錄 |
/bin | Contains binaries 存放系統的程式 |
/boot | 有關啟動的信息,初始化的 RAM與硬碟鏡像,以及linux內核 |
/dev | 存放驅動程式 |
/etc | 存放系統,程式的配置文件,和shell script |
/home | 給用戶使用的文件夾,一般用戶只需要在這個文件件內工作 |
/lib | 所有程式使用的庫文件(有點像windows的DLL文件)都在這裡 |
/lost+found | 被格式化的linux文件系統才會有這個文件夾,可以用來部分的恢覆文件。除非發生了糟糕的事情,它一般是空的 |
/mnt | 只出現在老的linux上,用來存放可移動設備的驅動 |
/opt | 可選的程式都放在這裡,這裡一般存放用戶後來安裝的程式 |
/proc | 這是一個特殊的文件夾。它是一個虛擬文件夾,相當於一個通向linux內核的窺視孔,你可以從裡面的文件看到內核是如何看當前這一臺PC的 |
/root | root 賬號的目錄 |
/sbin | 超級用戶使用,內含核心系統程式 |
/tmp | 臨時文件存放處 |
/usr | 一般來說都是最大的一個文件夾,含有所有常規用戶使用的程式和文件 |
/usr/bin | 存放安裝的linux可執行文件 |
/usr/lib | 用戶安裝文件使用的庫文件 |
/usr/local | 用戶安裝的程式,一般從源碼編譯的文件都裝在這裡 |
/usr/sbin | 存放安裝的管理員程式 |
/usr/share | 存放/usr/share中程式共用的文件 |
/usr/share/doc | 一般安裝的一些包都含有文檔,就放在啊這裡 |
/var | 也是用來存放經常被更改的文件,例如用戶郵件 |
/var/log | 存放日誌文件 |
Symbolic Links
Linux中獨特的一種文件形式,可以連接到其他文件。也叫做軟式連接 soft link,他可以方便我們更新某些組件的版本,因為link可以當做是變數名一樣。
4. 操作文件與目錄
本節我們將介紹命令:
- cp:拷貝文件/目錄
- mv: 移動 or 重命名 文件/目錄
- mkdir:創建目錄
- rm:刪除文件/目錄
- ln:創建link
通配符 (wildcards)
星號* 對應所有的符號(含複數個)
?對應所有的單個符號
[character]對應任意一個屬於括弧內集合的符號
[!character]對應任意一個不屬於括弧內集合的符號
[[:class:]]對應任意一個屬於該類型的符號,類型為:
[:alnum:] 對應所有字母數字
[:alpha:] 對應所有字母
[:digit:] 對應所有數字
[:lower:] 對應所有小寫字元
[:upper:] 對應所有大寫字元
一些通配符的例子:
* 所有文件
g* 所有以字母 g 開頭的文件
b*.txt 所有以字母 b 開頭且結尾是 .txt 的文件
Data??? 所有以 Data 開頭,後面接著三個符號的文件
[abc]* 所有以 a 或者 b 或者 c 開頭的文件
BACKUP.[0-9][0-9][0-9] 所有已 BACKUP. 開頭後接三個數字的文件
[[:upper:]]* 所有以大寫字母開頭的文件
[![:digit:]]* 所有以非數字開頭的文件
*[[:lower:]123] 所有以小寫字母或者 1 或者 2 或者 3 結尾的文件
mkdir 創建目錄
我們可以單獨創建一個目錄 或者連續創建多個目錄:
mkdir dir1
mkdir dir1 dir2 dir3
cp 拷貝文件
將文件/目錄 1 拷貝至 文件/目錄2:
cp item1 item2
拷貝複數個文件/目錄到一個目錄:
cp item... directory
cp命令的選項有:
-d 複製相同的符號連接
-p 複製相同的文件屬性
-R 遞歸複製目錄下的所有文件
-a 等於-dpR
-i 互動式拷貝,在需要覆蓋原有文件之前詢問用戶
-u 只複製目標目錄中沒有的文件
-v 詳細顯示操作的消息
mv 移動或者重命名文件
-i 互動式拷貝,在需要覆蓋原有文件之前詢問用戶
-u 只複製目標目錄中沒有的文件
-v 詳細顯示操作的消息
rm 刪除文件
-i 互動式刪除,在動作之前詢問
-f 無提示不檢查暴力刪除
-v 顯示詳細操作信息
rm 的使用是比較危險的,註意空格會造成截然不同的結果:
rm *.html 將會刪除所有目錄下的 html 格式文件,然而如果我們錯誤的使用了一個空格
rm * .html 將會刪除全部目錄下的文件並提示找不到文件 .html
ln 創造鏈接
ln file link
註意軟硬鏈接的不同,一般我們使用軟鏈接就好.
5. 使用命令工作
命令的種類可以分為:
- 可執行程式
- shell 自建的命令
- shell 方程
- 一個其他命令的代稱
顯示命令的種類 type
type command
顯示可執行命令的位置 which
which command
獲取命令的幫助 help
help command
這是一個非常重要的命令,可以用來學習大量的命令
有一些命令支持使用
command --help
來獲取幫助信息。
獲取可執行命令的手冊 man
man 命令可以獲得命令的完全手冊, 很多手冊都非常凶殘且難以閱讀 比如 bash 的。
man program
apropos 命令獲得一個粗略的模糊的潛在搜索名單
apropos command
簡化版的手冊 whatis
使用 whatis 可以獲得簡短的幫助文件
whatis program
>ls(1) - list directory contents
另一個可選的手冊 info
用法和 man 一樣。
使用 alias 製作自己的命令
語法:
alias name='string'
這裡舉一個例子,我們要進入 /usr 目錄,運行 ls 然後在返回之前的目錄,即:
naist-wavenet125-052:~ YunduanCUI$ cd /usr;ls;cd -
X11 bin libexec sbin standalone
adic lib local share
/Users/YunduanCUI
naist-wavenet125-052:~ YunduanCUI$
我們使用一個沒有被占用的名稱 foo 來建立這個聯合命令:
alias foo='cd /usr; ls; cd -'
naist-wavenet125-052:~ YunduanCUI$ foo
X11 bin libexec sbin standalone
adic lib local share
/Users/YunduanCUI
naist-wavenet125-052:~ YunduanCUI$
此時我們檢查 foo 的類型就會發現:
naist-wavenet125-052:~ YunduanCUI$ type foo
foo is aliased to `cd /usr; ls; cd -'
抹去這個自定義的命令,使用:
unalias name
6. 重定向 Redirection
本節我們學習輸入輸出的重定向 I/O Redirection, 學習的命令包括:
cat 連接文件
sort 排列
uniq 報告或刪除重覆行
grep 列印符合要求的行
wc 向文件中輸入
head 輸出文件首的部分
tail 輸出文件尾的部分
tee 標準輸入輸出
命令的交互包括輸入輸出和錯誤信息。因為UNIX中所有的物件都是文件,所以實際列印在屏幕上的也是標準的輸出,只是這些沒有被保存為磁碟上的文件。
標準輸出重定向
標準輸出重定向的符號是 >
naist-wavenet125-052:~ YunduanCUI$ ls -l > ~/ls-output.txt
之後就生成了相應的文件,註意這裡就不在有屏幕顯示了。將生成的文件作為標準輸入的話,我們可以使用 ls 命令來直接查看它的文件狀態:
naist-wavenet125-052:~ YunduanCUI$ ls -l ls-output.txt
如果要查看,我們使用 less 命令:
naist-wavenet125-052:~ YunduanCUI$ less ls-output.txt
標準錯誤重定向
使用運算符 2>
naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr 2> ls-error.txt
如果同時需要重新定向標準輸出和錯誤輸出的話,可以使用
naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr > ls-output.txt 2>&1
即輸出的錯誤重定向到當先的標準輸出位置(已經被重新定向過了),這樣的話,沒有錯誤就輸出標準輸出,有錯誤就輸出標準錯誤輸出。
當前的bash提供另一個方式來重定向輸出和錯誤:
naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr &> ls-output.txt
清除不想要的輸出
當你不想看到輸出的錯誤信息時,可以重定向它們到比特桶里:
naist-wavenet125-052:~ YunduanCUI$ ls -l /bin/usr 2> /dev/null
重定向標準輸入
使用cat連接文件
cat實質上會把第一個參數的文件直接輸出,在你沒有指定第二個目標文件的參數時,它選擇將第一個參數文件的內容列印到屏幕上。如果不給參數的話,cat進入輸入模式,無論輸入什麼,它都直接將輸入列印到屏幕。
naist-wavenet125-052:~ YunduanCUI$ cat > lazy_dog.txt
The quick brown fox jumped over the lazy dog.
實現了將輸入內容重定向到指定文件。
管道
管道 | 可以直接將第一個命令的輸出傳遞到第二個命令的輸入。
naist-wavenet125-052:~ YunduanCUI$ ls -l /usr/bin | less
要註意與重定向的不同,重定向連接的是命令與文件而管道連接的是命令的輸出和另一個命令的輸入。
過濾器
使用sort來進行預先排序
naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | less
使用uniq來消除重覆行
naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | uniq | less
使用 uniq -d 來查看重覆內容
naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | uniq -d | less
使用 wc 來計算行數字數比特數
naist-wavenet125-052:~ YunduanCUI$ wc ls-output.txt
1 7 40 ls-output.txt
輸出表示有一行七個字元共40比特,使用 wc -l 可以只計算行數
grep 尋找指定行
naist-wavenet125-052:~ YunduanCUI$ ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
bzip2recover
funzip
gunzip
gzip
unzip
unzipsfx
zip
zipcloak
zipdetails
zipdetails5.16
zipdetails5.18
zipgrep
zipinfo
zipnote
zipsplit
尋找帶 zip 的行。
使用 head 和 tail 命令來選擇開頭或結尾的內容
head -n 5
tail -n 5
指定行數選擇內容。
tail -f
動態顯示當前更新的行尾。
使用 shell
本章我們著重講一個命令 echo,它的作用是輸出一行文檔。
naist-wavenet125-052:~ YunduanCUI$ echo this is a test
this is a test
shell 完全支持正則表達式,使用 *,我們得到:
naist-wavenet125-052:~ YunduanCUI$ echo *
Applications Desktop Documents Downloads Dropbox Google 雲端硬碟 Library LinuxScript Movies Music Pictures Public Python Python_space TEXex Ten Thumbs Students VirtualBox VMs email feedparser-5.1.3 lazy_dog.txt ls-error.txt ls-output.txt nusers python.vim ros_catkin_ws src subl testDigits trainingDigits unixstuff vim vimtext vimtext2 wordpress 百度雲同步盤
可以靈活的使用,像:
naist-wavenet125-052:~ YunduanCUI$ echo D*
Desktop Documents Downloads Dropbox
naist-wavenet125-052:~ YunduanCUI$ echo *s
Applications Documents Downloads Movies Pictures Ten Thumbs Students VirtualBox VMs nusers ros_catkin_ws testDigits trainingDigits wordpress
naist-wavenet125-052:~ YunduanCUI$ echo [[:upper:]]*
Applications Desktop Documents Downloads Dropbox Google 雲端硬碟 Library LinuxScript Movies Music Pictures Public Python Python_space TEXex Ten Thumbs Students VirtualBox VMs
naist-wavenet125-052:~ YunduanCUI$ echo /usr/*/share
/usr/X11/share /usr/local/share
波浪號的使用
~ 表示當前用戶的 home 目錄
naist-wavenet125-052:~ YunduanCUI$ echo ~
/Users/YunduanCUI
算數擴張
naist-wavenet125-052:~ YunduanCUI$ echo $((2+2))
4
使用時要註意數學表達式的專用形式 $((expression)), 支持加減乘除取模和乘方(**)運算。
中括弧擴張
中括弧擴張讓格式化重覆字元變得可能:
naist-wavenet125-052:~ YunduanCUI$ echo Front-{A,B,C}-back
Front-A-back Front-B-back Front-C-back
註意{}內部和之間不可以有空格。使用 ... 可以更加方便的計數:
naist-wavenet125-052:~ YunduanCUI$ echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5
naist-wavenet125-052:~ YunduanCUI$ echo {Z..A}
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
聯合起來使用:
naist-wavenet125-052:~ YunduanCUI$ echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b
naist-wavenet125-052:~ YunduanCUI$ mkdir Photos
naist-wavenet125-052:~ YunduanCUI$ cd Photos/
naist-wavenet125-052:Photos YunduanCUI$ ls
naist-wavenet125-052:Photos YunduanCUI$ mkdir {2012..2016}-{01..12}
naist-wavenet125-052:Photos YunduanCUI$ ls
2012-1 2012-8 2013-6 2014-4 2015-2 2016-11
2012-10 2012-9 2013-7 2014-5 2015-3 2016-12
2012-11 2013-1 2013-8 2014-6 2015-4 2016-2
2012-12 2013-10 2013-9 2014-7 2015-5 2016-3
2012-2 2013-11 2014-1 2014-8 2015-6 2016-4
2012-3 2013-12 2014-10 2014-9 2015-7 2016-5
2012-4 2013-2 2014-11 2015-1 2015-8 2016-6
2012-5 2013-3 2014-12 2015-10 2015-9 2016-7
2012-6 2013-4 2014-2 2015-11 2016-1 2016-8
2012-7 2013-5 2014-3 2015-12 2016-10 2016-9
參數擴張
echo 也可以用來顯示參數名,使用$即可:
naist-wavenet125-052:~ YunduanCUI$ echo $USER
YunduanCUI
顯示了自己的名稱,如果參數不存在,則什麼也不顯示。
與命令行的聯動