Linux的基礎知識以及相關概念
一、Linux的發行版本
所謂發行版,就是linux核心 + 開源程式
debain,ubuntu 其中ubantu是debain的衍生版,桌面系統比較好,适合于初學者入門。
slackware, susE
redhat,centos,fedora 其中centos,fedora都是redhat的衍生版,fedora主要是測試redhat的新技術。而centos主要是redhat的社群版,免費使用。
ArchLinux
Gentoo 是針對于技術牛而使用的,安裝過程比較複雜。
LFS 是Linux From Scratch的簡寫,從零開始搭建一個簡易版的Linux發行版,對于了解Linux編譯參數是一個不錯的選擇。
二、Linux的哲學思想
一切皆檔案
由衆多功能單一的小程式組成;每個小程式完成單一的一件事
組合小程式來完成複雜的任務
盡可能避免人機互動,友善腳本的編寫
使用文本檔案來儲存配置資訊
通過機制,而非政策
三、常見的開源協定
GPLv2, GPLv3
GPL協定是比較嚴苛的,隻要使用了GPL協定的代碼,都必須要開源
LGPL: Lesser
寬松的GPL協定,對于知識應用了庫檔案,可以不進行開源
BSD:
如果二次釋出的産品中包含源代碼,則在源代碼中必須帶有原來的代碼中的BSD協定
如果二次釋出的隻是二進制格式的庫或程式,則需要在釋出的文檔或版權聲明中說明包含原來的代碼中的BSD協定
不可以用開源代碼的作者/組織和原來的産品名字做市場推廣
Apache License:
Apache協定與BSD協定規範一樣
四、bash的特性
1、指令與路徑補全
根據内建指令或外部指令的查找方式查找以使用者指定的字元串開頭的指令
以使用者指定的起始路徑進行檔案名補全查找
如果使用者指定的開頭字元串能惟一辨別某指令或路徑,則tab鍵可補全此指令或路徑。否則,則兩次tab鍵可顯示所有以指定字串開頭的指令或指定路徑下所有檔案
2、指令行展開
~:展開為使用者家目錄
~USERNAME:展開為指定使用者的家目錄
{}使用多項式乘法展開,例如 /tmp/{a,b}/{c,d}展開為/tmp/a/c,/tmp/a/d,/tmp/b/c,/tmp/b/d。
3、指令别名和指令引用
1)指令别名:
别名設定:
alias ALIAS=COMMAND,例如:alias cls='clear'
當别名與指令名同名是:使用絕對路徑或\COMMAND的方法是用本來命的含義
指令行修改的别名隻對目前會話有效,要想長期儲存,需要寫到配置檔案~/.bashrc中去
取消别名:
unalias ALIAS 例如:unalias cls
-a 撤銷所有别名
2)指令引用
"":裡面支援變量的引用
``:引用一個指令執行結果,等價于$()
1
2
3
4
<code>[root@server </code><code>alias</code><code>]</code><code># mkdir file-`date +%F-%H-%M-%S`</code>
<code>[root@server </code><code>alias</code><code>]</code><code># mkdir file-$(date +%F-%H-%M-%S)</code>
<code>[root@server </code><code>alias</code><code>]</code><code># ls</code>
<code>file</code><code>-2014-07-03-21-24-10 </code><code>file</code><code>-2014-07-03-21-24-33</code>
4、bash特性之檔案名通配(globbing):
*: 任意長度的任意字元
?: 比對任意單字元
[]: 比對指定範圍内的任意單字元
[^]:比對指定範圍以外的任意單字元
字元集合:
[:space:] : 所有空白字元
[:punct:] : 所有标點符号
[:lower:] :所有小寫字母
[:upper:]:所有大寫字母
[:digit:]:所有數字
[:alnum:]:所有字母+數字
[:alpha:]:所有字母
練習使用:
1、顯示/tmp/test/目錄下所有以a開頭,以一個小字母結尾,且中間出現一位數字的檔案或目錄
<code>[root@server </code><code>test</code><code>]</code><code># ls -d /tmp/test/a*[[:digit:]]*[[:lower:]]</code>
<code>/tmp/test/a22e</code> <code>/tmp/test/a22r</code>
2、顯示/tmp/test/目錄下,以任意一位數字開頭,且以非數字結尾的檔案或目錄
<code>[root@server </code><code>test</code><code>]</code><code># ls -d /tmp/test/[[:digit:]]*[^[:digit:]]</code>
<code>/tmp/test/224r</code> <code>/tmp/test/23ddd</code>
3、顯示/tmp/test/目錄下,以非字母開頭,後面跟了一個字母及其它任意長度字元的檔案或目錄
<code>[root@server </code><code>test</code><code>]</code><code># ls -d /tmp/test/[^[:alpha:]][[:alpha:]]*</code>
<code>/tmp/test/2s4df</code>
5、支援快捷鍵
ctrl + a回到指令行首部
ctrl + e回到指令行尾部
ctrl + u删除指令行首到光标處的所有内容
ctrl + k删除指令行尾到光标處的所有内容
ctrl + c終止指令執行
ctrl + l隻做清屏,如有指令行在編寫,則依然存在可以編寫
ctrl + z将目前指令轉入背景執行
ctrl + r啟動指令搜尋功能,搜素以前使用過的指令
6、bash環境
bash是一個解釋器,可以提供程式設計環境,解釋器解釋的步驟:詞法分析,文法分析,語義分析。
1)bash的變量:
變量類型
變量作用範圍
定義變量
引用變量
取消變量
變量檢視
本地變量
隻對目前shell程序有效;對其他shell和目前shell的子shell無效
VAR_NAME=VALUE
$VAR_NAME
unset VARNANE
set
環境變量
對目前shell及其子shell有效,對其他shell無效
export VAR_NAME=VALUE,此時變量定義并指派了
或者 export VAR_NAME,此時隻是定義了環境變量,沒有指派,變量值為空
expotrt
printenv
env
局部變量
是針對于shell腳本内部有效的。通常用于函數中。與C語言中的局部變量作用範圍類似
local VAR_NAME=VALUE
位置變量
一般用于參數傳遞,用在腳本中居多。$1,$2,...分别表示參數的第一個,第二個參數,$0表示指令本身
$#
#:代表數字0,1,2...
特殊變量
記錄指令執行的一些狀态變量
$? 記錄最進一條指令執行是否成功。成功為0,不成功為非0。
$#:儲存一個指令的參數個數
S*: 一個指令所有參數,以一個“”包含
$@:一個指令的所有參數,每個參數以一個“”包含
$!:上一個指令的PID
$$:目前程序的PID
2)變量命名規則:
不能使用bash程式中的關鍵字(保留字),所謂系統關鍵字就是系統已有的變量名,指令等名字
隻能使用數字、字母、下劃線,并且不能一數字開頭
盡量要做到顧名思義
3)變量的類型
1.數值型
精确數值:整數
近似數值:浮點數
單精度浮點
雙精度浮點
2.字元型
char,string
3.布爾型
true,false 用來判斷邏輯關系的
4)bash的配置檔案
配置檔案種類
适用對象
功能
profile類
全局:/etc/profile
/etc/profile.d/*.sh
互動式登陸使用者
直接通過終端輸入賬号和密碼登陸
設定環境變量
運作指令後腳本
使用su -l USERNAME
使用者:~/.bash_profile
su - USERNAME登陸
bashrc類
全局:/etc/bashrc
非互動式登陸使用者
su USERNAME
設定本地變量
設定指令别名
使用者:~/.bashrc
圖形界面下打開的終端
執行腳本
補充:bash配置檔案讀取順序
互動式登陸的使用者:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash.profile --> ~/.bashrc--> /etc/bashrc
非互動登陸使用者:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
五、Linux的檔案層次(FHS)
Linux檔案系統的基礎特性:
1、檔案名嚴格區分大小寫
2、所有檔案都們于根目錄下,FHS
3、路徑以/做為分隔符
4、每個檔案的名稱可使用除/以外任意字元,單個名稱最長不能超出255個字元;
/bin, /sbin: 系統自身啟動和運作時可能會使用者的核心二進制指令
/lib: 共享庫檔案和核心子產品
/lib64: 64位系統的共享庫檔案和核心子產品
/etc: 配置檔案
/usr:
/usr/bin, /usr/sbin: 系統運作中,使用者為完成某些操作可能用到的指令
/usr/lib, /usr/lib64: 庫檔案
/usr/share/man, /usr/share/doc:應用程式手冊或幫助文檔
/dev: devices的簡寫,所有裝置的裝置檔案都存放于此處;裝置檔案通常也稱為特殊檔案(僅有中繼資料,而沒有資料)
/proc: 僞檔案系統,核心和程序資訊的虛拟檔案系統接口,像系統系統後,CPU、記憶體都抽象為檔案放在此目錄下
/sys: 僞檔案系統,硬體裝置資訊虛拟檔案系統接口
/boot: 系統引導加載時用到的靜态檔案,核心和ramdisk(CentOS5:initrd,CentOS6:initramfs), grub(bootloader)
/home/USERNAME:指定使用者的家目錄
/root:root使用者的家目錄
/mnt:臨時檔案挂載的路徑
/media:便攜式裝置的挂載路徑,像U盤,CD
/srv: 服務所用到的資料
/tmp: 臨時檔案存儲位置
/var: 經常發生變化的檔案
/var/log:裡面存放各個應用程式的日志檔案
/misc: 備用目錄
/opt: 第三方應用程式的安裝目錄
/usr/local: 現在軟體安裝的目錄
/selinux Security Enhanced Linux: 安全加強的Linux
六、linux中的機關換算
8 bit = 1 Byte
1024 B = 1 K
1024 K = 1 M
1024 M = 1 G
1024 G = 1 T
1024 T = 1 P
1024 P = 1 E
1024 E = 1 Z
1024 Z = 1 Y
七、自由軟體的定義
自由使用
自由學習和修改
自由分發
自由建立衍生版
八、重定向
1)重定向就是改變應用程式或指令輸入和輸出流的位置
檔案描述符:fd,核心中唯一辨別檔案的一個數字
檔案類型
檔案描述符
一般裝置
标準輸入
滑鼠
标準輸出
顯示器
标準錯誤輸出
2)輸出重定向
輸出重定向:将應用程式标準輸出儲存到指定的檔案中
輸出重定向格式
CMOMMAND > POSITION
覆寫輸出
CMOMMAND >> POSITION
追加輸出
錯誤輸出重定向:将應用程式标準錯誤輸出儲存到指定的檔案中
錯誤輸出重定向格式
CMOMMAND 2> POSITION
CMOMMAND 2>> POSITION
重定向合并:将标準輸出和标準錯誤輸出儲存到指定相同檔案中
重定向合并格式
CMOMMAND &> POSITION 或者 CMOMMAND > POSITION 2 > &1
CMOMMAND &>> POSITION 或者 CMOMMAND >> POSITION 2 > &1
分别重定向:将标準輸出和标準錯誤輸出儲存到指定不
分别重定向格式
CMOMMAND > POSITION1 2> POSITION2
CMOMMAND >> POSITION1 2>> POSITION2
/dev/null 資料黑洞,可以将資料随時扔到裡面,也可以從裡面無窮取得資料
可以設定bash的工作特性:
set -C 作用是如果要輸出的檔案存在,則不能覆寫
5
<code>[root@server ~]</code><code># set -C ;cat /etc/fstab > /tmp/test/myfstab</code>
<code>-</code><code>bash</code><code>: </code><code>/tmp/test/myfstab</code><code>: cannot overwrite existing </code><code>file</code>
<code>####此時可以使用以下指令強制覆寫</code>
<code>[root@server ~]</code><code># cat /etc/fstab >| /tmp/test/myfstab</code>
set +C:取消上面bash的設定
3)輸入重定向
輸入重定向:将标準輸入以指定的檔案代替
CMOMMAND < POSITION1 對于有些程式(指令)無輸入流是,可采用輸入重定向,比如:tr指令
6
7
8
9
10
<code>[root@server </code><code>test</code><code>]</code><code># tr 'a-z' 'A-Z' /tmp/test/test</code>
<code>tr</code><code>: extra operand `</code><code>/tmp/test/test</code><code>'</code>
<code>Try `</code><code>tr</code> <code>--help' </code><code>for</code> <code>more</code> <code>information.</code>
<code>#像這種指令沒有标準輸入參數,靠重定向輸入傳遞輸入資料流</code>
<code>[root@server </code><code>test</code><code>]</code><code># tr 'a-z' 'A-Z' < /tmp/test/test </code>
<code>THIS IS A TEST FILE!</code>
<code>HOU ARE YOU?</code>
<code>HELLOW WORLD.</code>
<code>123COMMAND1234098</code>
<<:追加重定向,一般是與輸出重定向一起使用
CMOMMAND > POSITION1 << END(自定義的結束标志)
<code>[root@server </code><code>test</code><code>]</code><code># cat << END > /tmp/test/a.out</code>
<code>> hello</code>
<code>> thank you!!</code>
<code>> END</code>
<code>[root@server </code><code>test</code><code>]</code><code># cat /tmp/test/a.out </code>
<code>hello</code>
<code>thank you!!</code>
<code>#一般是像這樣使用的</code>
tee指令:實作一輸入多輸出
COMMAND | tee POSITION
11
<code>[root@server </code><code>test</code><code>]</code><code># cat /tmp/test/test | tee /tmp/mytest.test</code>
<code>this is a </code><code>test</code> <code>file</code><code>!</code>
<code>hou are you?</code>
<code>123command1234098</code>
<code>[root@server </code><code>test</code><code>]</code><code># cat /tmp/mytest.test </code>
未完待續......
本文轉自 羊木狼 51CTO部落格,原文連結:http://blog.51cto.com/guoting/1433602,如需轉載請自行聯系原作者