歡迎您光臨本站 註冊首頁

Linux 基礎總結(一)

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

Linux 基礎總結(一)


Linux 基礎總結(一)


  
以前做嵌入式的時候用到過linux,不過大部分操作都在ubuntu的界面環境下完成,使用一些簡單的命令來配置,編譯linux內核,現在要在終端下工作,所以整理一些自己平時遇到的問題,有不對不足的地方還望大家指出。



目錄:
1. Linux常用系統變數
2. linux alias詳解
3. Source 命令詳解
4. Linux ps1 ps2 ps3 ps4詳解
5. linux id 命令詳解  
6. umask 詳解
7. linux trap命令 詳解
8. Linux stty



(1)Linux 常用系統變數

$0           當前shell程序的名字

$1 ~ $9   命令行上的第一到第九個參數

$#           命令行上的參數個數

$*           命令行上的所有參數

$@         分別用雙引號引用命令行上的所有參數

$$           當前進程的進程標識號(PID)

$?           上一條命令的退出狀態

$!            最後一個後台進程的進程標識號

系統變數只能引用不能修改!



(2)linux alias詳解

一、簡介

linux alias是命令的一種別稱,輸入

alias

可以看到像下面這樣的結果:

alias vi="vim"

也即,輸入vi后,被自動定向到vim這個命令了。alias的作用就是,可以簡寫命令。



二、修改alias

若要添加自己的alias,格式如下

alias la="ls -al --color=auto"



三、修改配置文件

上述命令,在用戶登出后就無效了,可以用修改配置文件的辦法,使每次都能夠自動生效。

若要修改用戶(而非全部用戶)自己的alias,可以修改~/.bashrc文件

vii ~/.bashrc

再最後面加上你自己定義的alias,如

alias la="ls -al --color=auto"

這個修改,要下次登錄的時候才能生效。想要即刻生效,可以輸入

source ~/.bashrc



四、常用的alias

這個根據個人愛好了,可以google之~找到你自己喜歡的alias



五、修改全局的alias可以修改系統配置文件,我這裡就不說了。

還有其他的方面知識,如互動式、非互動式登錄的配置文件,這個也不多說了。



(3)source命令詳解

source FileName

作用:在當前bash環境下讀取並執行FileName中的命令。

註:該命令通常用命令「.」來替代。

如:source .bash_rc 與 . .bash_rc 是等效的。



source命令(從 C Shell 而來)是bash shell的內置命令。點命令,就是個點符號,(從Bourne

Shell而來)是source的另一名稱。同樣的,當前腳本中配置的變數也將作為腳本的環境,source(或點)命令通常用於重新執行剛修改的初始化

文檔,如 .bash_profile 和 .profile 等等。例如,假如在登錄后對 .bash_profile 中的 EDITER 和

TERM 變數做了修改,則能夠用source命令重新執行 .bash_profile 中的命令而不用註銷並重新登錄。

比如您在一個腳本里export $KKK=111 ,假如您用./a.sh執行該腳本,執行完畢后,您運行 echo $KKK

,發現沒有值,假如您用source來執行,然後再echo

,就會發現KKK=111。因為調用./a.sh來執行shell是在一個子shell里運行的,所以執行后,結構並沒有反應到父shell里,但是

source不同他就是在本shell中執行的,所以能夠看到結果



source命令的一個妙用



在編譯核心時,常常要反覆輸入一長串命令,如

make mrproper

make menuconfig

make dep

make clean

make bzImage

.......

這些命令既長,又繁瑣。而且有時候容易輸錯,浪費你的時間和精力。如果把這些命令做成一個文件,讓它自動按順序執行,對於需要多次反覆編譯核心的用

戶來說,會很方便。用source命令可以辦到這一點。它的作用就是把一個文件的內容當成是shell來執行。先在/usr/src/linux-

2.4.20目錄下建立一個文件,取名為make_command:

在其中輸入如下內容:

make mrproper &&

make menuconfig &&

make dep &&

make clean &&

make bzImage &&

make modules &&

make modules_install &&

cp arch/i386/boot/bzImge /boot/vmlinuz_new &&

cp System.map /boot &&

vi /etc/lilo.conf &&

lilo -v

文件建立好之後,以後每次編譯核心,只需要在/usr/src/linux-2.4.20下輸入

source make_command

就行了。這個文件也完全可以做成腳本,只需稍加改動即可。這裡主要是讓大家理解source的用法。如果你用的不是lilo來引導系統,可以把最後兩句話去掉。配置你自己的引導程序來引導新內核。



shell編程中的命令有時和C語言是一樣的。&&表示與,||表示或。把兩個命令用&&聯接起來,如

make mrproper && make menuconfig

,表示要第一個命令執行成功才能執行第二個命令。對執行順序有要求的命令能保證一旦有錯誤發生,下面的命令不會盲目地繼續執行。



(4)Linux ps1 ps2 ps3 ps4詳解

用戶登錄Linux系統的字元界面后,就會出現"#"或"$"等命令提示符,比如"# 「、"$」或是 「-bash-3.00#」等等。

通過設置環境變數PS1、PS2、PS3以及PS4來自定義用戶命令行的字元顯示。如果要長期永久性修改提示符,可以將修改提示符的命令添加到$HOME/.profile或$HOME/.bash_profile文件中。

1. PS1

PS1是主提示符變數,也是默認提示符變數。默認值"/s-/v/$「,顯示shell類型和版本。

基本上通過設置PS1來定義命令行提示字元即可,最常用的需求就是顯示登錄的用戶名、主目錄、主機名等等,舉個例子如下:

顯示用戶名,主機名和動態顯示當前目錄

-bash-3.00# export PS1=""

cd /etc



注意:如果當前目錄是用戶的HOME目錄,則顯示"~"

PS1變數可以使用的參數值有如下:





/d


代表日期,格式為weekday month date,例如:"Mon Aug 1"




/H


完整的主機名稱。例如:我的機器名稱為:fc4.linux,則這個名稱就是fc4.linux




/h


僅取主機的第一個名字,如上例,則為fc4,.linux則被省略




/t


顯示時間為24小時格式,如:HH:MM:SS




/T


顯示時間為12小時格式




/A


顯示時間為24小時格式:HH:MM




/u


當前用戶的賬號名稱




/v


BASH的版本信息




/w


完整的工作目錄名稱。家目錄會以 ~代替




/W


利用basename取得工作目錄名稱,所以只會列出最後一個目錄




/#


下達的第幾個命令




/$


提示字元,如果是root時,提示符為:# ,普通用戶則為:$




/[


字元"["




/]


字元"]"




/!


命令行動態統計歷史命令次數


2. PS2

PS2是副提示符變數,默認值是''> ''。

PS2一般使用於命令行里較長命令的換行提示信息,比如:

默認設置

-bash-3.00# rpm -q gcc make binutils openmotif setarch compat-db compat-gcc /

> compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel

自定義設置

-bash-3.00# export PS2="PS2 => "

-bash-3.00# rpm -q gcc make binutils openmotif setarch compat-db compat-gcc /

PS2 => compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel

3. PS3,PS4

這兩個環境變數可能用得不多,不研究了。如果有興趣,可以學習bash裡面的簡介。

(可以百度 linux超級技巧,第33章專門講述了ps3,ps4)

PS3 The value of this parameter is used as the prompt for the select command (see SHELL GRAMMAR above).

PS4 The value of this parameter is expanded as with PS1 and the value is printed before each command bash displays during an execution trace. The first character of PS4 is replicated multiple times, as neces-sary, to indicate multiple levels of indirection. The default is ''+ ''.



(5)linux id 命令詳解

功能說明:顯示用戶的ID,以及所屬群組的ID。



語  法:id [-gGnru][--help][--version][用戶名稱]

補充說明:id會顯示用戶以及所屬群組的實際與有效ID。

     若兩個ID相同,則僅顯示實際ID。若僅指定用戶名稱,則顯示目前用戶的ID。



參  數:

-g或--group   顯示用戶所屬群組的ID。

-G或--groups   顯示用戶所屬附加群組的ID。

-n或--name    顯示用戶,所屬群組或附加群組的名稱。

-r或--real       顯示實際ID。

-u或--user     顯示用戶ID。

-help             顯示幫助。

-version        顯示版本信息。



(6)umask詳解

umask=022中"022"是八進位的寫法,如果換成二進位是000010010

在unix中文件許可權是三類用戶,三種許可權。三類用戶分別是文件所有者user(u),文件所有者所在主群組group(g)、其它用戶others(o),三種許可權分別是起讀read(r)、寫write(w)、執行execute(x)。



如果一個文件的許可權如下:所有者有讀寫的許可權,群組有讀和執行許可權、其它用戶有讀許可權,可以寫成:

rw-xr-r--

其中前三位指明了所有者的許可權、中間三位指明了組許可權、最後三位指明了其它用戶的許可權。我們用ls -l可以看到文件許可權詳情,列出來的是10位,最前一位如果是d表示是子目錄。

事實上,新建文件夾或文件的許可權是由所謂基本碼減去稱之為umask的屏蔽位得到的。

按照規定:文件夾的基本碼是rwxrwxrwx(777),文件的基本碼是rw-rw-rw-(666)

而屏蔽位則是在/etc/profile(所有人)或者~/.profile中設定的。如果上述文件中皆無設定則默認就是022



我們可以在shell下面輸入umask命令查看/修改當前的系統屏蔽位。

$ umask 033

$ umask

$ 033

$ umask 022



因此新建文件夾是777-022=755(rwxr-xr-x),新建文件是666-022=644(rw-r--r--)。

$ mkdir test

$ touch test.txt

$ ll

$ drwxr-xr-x ... test/

$ -rw-r--r-- ... test.txt

所以我們可以通過修改umask來改變新建文件文、件夾的許可權.



(7)linux trap命令 詳解

trap命令用於指定在接收到信號后將要採取的動作。常見的用途是在腳本程序被中斷時完成清理工作。不過,這次我遇到它,是因為客戶有個需求:從終端訪問伺服器的用戶,其登陸伺服器後會自動運行某個命令,例如打開應用(命令寫在.bashrc等文件中),最後退出,並斷開連接;期間是不能允許其使用Ctrl+C等中斷退出應用,而回到Shell環境,否則可能會帶來安全問題。

當然,解決的方式有很多,如在應用中屏蔽中斷信號、使用chroot方式訪問等。但這些方法都有一些限制,如需要修改應用,讓telnet等支持chroot方式(ssh可支持chroot)等。而使用trap也是一種比較好的解決方法。

一、關於信號

歷史上,shell總是用數字來代表信號,而新的腳本程序應該使用信號的名字,它們保存在用#include命令包含進來的signal.h頭文件中,在使用信號名時需要省略SIG前綴。

kill和trap等都可以看到信號編號及其關聯的名稱。「信號」是指那些被非同步發送到一個程序的事件。默認情況下,它們通常會終止一個程序的運行。

引用

# trap -l

1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL

5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE

9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2

13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD

18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN

22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ

26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO

30) SIGPWR      31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1

36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4  39) SIGRTMIN+5

40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  43) SIGRTMIN+9

44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13

48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13

52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9

56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5

60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  63) SIGRTMAX-1

64) SIGRTMAX

附錄中有個說明文檔。

二、trap的使用

1、運行格式

trap命令的參數分為兩部分,前一部分是接收到指定信號時將要採取的行動,后一部分是要處理的信號名。

trap command signal

它有三種形式分別對應三種不同的信號回應方式。

第一種:

trap "commands" signal-list

當腳本收到signal-list清單內列出的信號時,trap命令執行雙引號中的命令。

第二種:

trap signal-list

trap不指定任何命令,接受信號的默認操作,默認操作是結束進程的運行。

第三種:

trap " " signal-list

trap命令指定一個空命令串,允許忽視信號,我們用到的就是這一種。

※ 請記住,腳本程序通常是以從上到下的順序解釋執行的,所以必須在你想保護的那部分代碼以前指定trap命令。

2、測試

按照用戶的要求,我們需要屏蔽的是HUP INT QUIT TSTP幾個信號。所以,可以運行:

# trap "" HUP INT QUIT TSTP

這個時候,可以試試打開一個持續的命令,然後中斷其運行,例如:

# tail -f /var/log/messages

接著,試試用Ctrl+C或 Ctrl+\ 來中斷試試,會程序是不會退出的。

3、恢複信號

如果想恢復的話,可以用Ctrl+Z把程序放到後台,然後運行:

# trap : HUP INT QUIT TSTP

然後,用ps -ef看看其PID號,bg 1讓程序繼續運行,最後用kill殺掉即可。

4、其他

您也可以試試運行:

# trap "echo 'Hello World' " HUP INT QUIT TSTP

這樣,當您運行Ctrl+C等中斷時,會自動運行echo命令,結果就是現實Hello World字元串:

引用

# tail -f /var/log/messages

May 18 16:57:54 192.168.228.153 dhcpd: DHCPREQUEST for 192.168.228.221 from 00:1d:72:92:d4:68 via eth0

May 18 16:57:54 192.168.228.153 dhcpd: DHCPACK on 192.168.228.221 to 00:1d:72:92:d4:68 via eth0

# Hello World

※ 注意,這方式並不能屏蔽中斷,敲入Ctrl+C等信息后,仍以默認行為動作的,也就是退出程序,僅會再運行一個額外的命令而已。

三、附錄

1、中斷按鍵

不同的終端類型、Shell版本其中斷的按鍵是不同的,甚至還可以自定義,這可通過stty命令查詢:

引用

# stty -a

speed 38400 baud; rows 30; columns 111; line = 0;

intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; start = ^Q; stop = ^S;

susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;

-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts

-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel

opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0

isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

^就是Ctrl的縮寫。

2、信號詳情

引用

名稱     默認動作            說明

SIGHUP     終止進程      終端線路掛斷

SIGINT   終止進程      中斷進程

SIGQUIT  建立CORE文件 終止進程,並且生成core文件

SIGILL   建立CORE文件       非法指令

SIGTRAP  建立CORE文件       跟蹤自陷

SIGBUS   建立CORE文件       匯流排錯誤

SIGSEGV  建立CORE文件       段非法錯誤

SIGFPE   建立CORE文件       浮點異常

SIGIOT   建立CORE文件       執行I/O自陷

SIGKILL  終止進程      殺死進程

SIGPIPE  終止進程      向一個沒有讀進程的管道寫數據

SIGALarm 終止進程      計時器到時

SIGTERM  終止進程      軟體終止信號

SIGSTOP  停止進程      非終端來的停止信號

SIGTSTP  停止進程      終端來的停止信號

SIGCONT  忽略信號      繼續執行一個停止的進程

SIGURG   忽略信號      I/O緊急信號

SIGIO    忽略信號      描述符上可以進行I/O

SIGCHLD  忽略信號      當子進程停止或退出時通知父進程

SIGTTOU  停止進程      後台進程寫終端

SIGTTIN  停止進程      後台進程讀終端

SIGXGPU  終止進程      CPU時限超時

SIGXFSZ  終止進程      文件長度過長

SIGWINCH 忽略信號      窗口大小發生變化

SIGPROF  終止進程      統計分布圖用計時器到時

SIGUSR1  終止進程      用戶定義信號1

SIGUSR2  終止進程      用戶定義信號2

SIGVTALRM終止進程      虛擬計時器到時

《解決方案》

謝謝分享

[火星人 ] Linux 基礎總結(一)已經有643次圍觀

http://coctec.com/docs/service/show-post-982.html