Unix Basic
1 UNIX起源、流派及標準1.1 UNIX的發展簡史
60年代由麻省理工學院、通用電器公司、AT&T貝爾試驗室組成一個專家小組,研制一個MULICS,是一個靈活的交互式操作系統。
60年后期,BELL脫離該組織,失去了靈活的交互式操作系統。
1990年,有一個叫Ken.Tompson寫了一個SPACE TRAVEL的游戲,是在PDP-7上寫的,為了更有效地發揮PDP-7的強大功能,托普森和另一位科學家Dennis Ritchie開發了一個新的操作系統UNIX。此前Dennis創建了C語言。
1973年Ken和Dennis用C語言重寫了UNIX。UNIX成為世界上第一個用高級語言寫的操作系統。
C語言使UNIX更容易移植,移植是UNIX最重要的優越性
70年代UNIX版本不斷更新,74年后,世界上所有的大學都可以以極小的代價獲得UNIX的源代碼,由此產生了很多重要的分支,包括一個BSD版,加州伯克利大學Berkeley Software Distribution。80年代AT&T重新命令UNIX版。
l 1973年,美國高等院校開始使用UNIX
l 1974年,Version 4
l 1976年,Version5,6
l 1978年,Bell開發出系統 III
l 1979年,Berkekey分校發布BSD 3
l 1982年,Berkekey分校發布BSD 4.2
l 1983年,Bell開發出系統V
l 1983年,Berkekey分校推出第一個內含TCPIP的BSD UNIX
l 1985年,AT&T 推出SVR2,即系統V,RELEASE 2
l 1987年,AT&T 推出SVR3
l 1989年,AT&T 推出SVR4
82年后,AT&T發布商業版,SYSTEM3以前均為內部使用。
BSD起源于1974年,伯克利研究小組畢業的學生Bill Joy開發出更好性能的UNIX。如CSH、VI、虛擬存儲環境,這些性能后來被柔進了SYSTEM 5。
1974 BSD 1979 2BSD 1982 3BSD
1984 4BSD 1987 4.3BSD 4.5BSD
在微機領域,71年分支出XENIX
81年 XENIX2.3 XENIX3.0 XENIX5.0遵守SVID
85年 AT&T宣布一個標準SVID
(Standard Called System U Imterface Defination)
85年出現SYSTEM U/386與SVID完全兼容。
當時主要的UNIX(XENIX、SYSTEMU、BSD)占80%。
BSD 一般出現在大學
SYSTEM為用于商業領域
XINIX 只用于PC
1.2 UNIX標準化
1984年歐州5家成立X/OPEN協會。
XPG3――XPG4
SPE C 1170
1985年IEEE公布POSIX 1003
1988年5月 DEC、IBM、HP 公布OSF(BSD)AES
1988年12月AT&T SUN公布UI (SYSTEM V)
1992年12月NOVELL購買USL轉讓給X/OPEN
1993年9月WINDOWS NT出現使OSF和UI和解,產生COSE。包括XPG4、POSIX、SUID3、SVR4.3、AES、MOTIF、TCPIP。
1.3 常見商業版本
SUN SOLORIS純SYSTEM V
IBM AIX4.3
HP-UX
IRIX遵守POSIX
Tru64 UNIX 成熟、統一對COSE遵守最好。SPEC1170 MACH微內核完整、大而全。
LINUX 自由軟件、微內核、多平臺支持各種協議。
2 DIGITAL UNIX優點
l 全64位軟硬件體系結構
l 最快的64位平臺
l SMP多線程共享程序、軟件升級不必重新連接、內存映射文件、 單一系統映像Cluster、VLM
l 具存防崩潰性能
l 超大規模收據庫訪問能力,支持大于17MB的文件
l 規模可伸縮
l 低成本管理
l 最OPEN、最標準
l 支持ADVFS、LSM、CLUSTER
l 支持各種網絡
l 國際化不另收費用
l 支持IEEE標準,POSIX命令及實時線程
l 支持FIPS 151 -2
l 支持ISO/IEC 9945-1 1990
l 支持X/OPEN 可移植性指南VOLUME4(XPG4)
l 支持BSD4.3 4.4
l 支持MIT XIIR5 ADK FOR XIIR6
l 支持FIPS 160(ANSI)
l 支持OSF MOTIF 1.2.3
l 支持UNIX 93
l 支持RFC
l 支持ISO 9660(CDFS)
l 支持NFS V.3
l 支持SVR4 SVR3 SVID2 SVID3
3 初次上機
3.1 進入系統
UNIX系統為多用戶,多任務操作系統,有很完善的用戶管理和安全機制,使用系統的每一個人都可以有一個用戶名,并有一個用戶識別碼UID,每個用戶至少屬于一個用戶組,可以同時屬于多個用戶組,組是UNIX系統為了方便用戶管理而建立的一個用戶集合,進入系統只需輸入自己的用戶名和口令,不需要輸入組名。
l 主機終端
按回車鍵開始登錄過程
l 終端服務器
按回車鍵登錄到終端服務器
用c命令 connect 開始登錄過程
l PC機
用telnet 命令
login:用戶名
password :口令 (不顯示出來)
PC 用Telnet 開始登錄過程
l Xwindows
輸入用戶名按回車
輸入口令按回車
可以選擇語言環境
3.2 改變口令
$ passwd 回車
old password:輸入舊口令
new password :輸入新口令
reenter new password :重新輸入,驗證
3.3 chsh 改變login shell
chsh
/bin /sh
/bin /csh
3.4 chfn 改變用戶電話號碼,力公室位置等信息
chfn
3.5 獲得幫助
help 命令獲極少的幫助
man 查有聯機手冊
man cmd 查看cmd詳細手冊
man –k keyword 查看與keyword相關的所有命令。
man n cmd
一般情況下手冊被分組為1到8其8個組,某些命令在多個組中均有幫助信息,用man n 指定讀取n組中的信息。
where is cmd
查看cmd的絕對路徑。
echo $PATH
which cmd
查看cmd 是哪個目錄的cmd
who am I whoamI
查看自己的用戶名
who, w
查看當前誰在系統上
users, u
查看當前系統的用戶
finger user
查看user 的信息
ps 顯示當前進程狀況
ps –u user 顯示用戶名為user 的進程狀況
3.6 作業調度
命令行可加&表示后臺執行
例 f 77 test.f & 在后臺執行編譯命令。
命令的輸入和輸出可重定向。
例 ls -l >dir.lis
lmf rdg -<l1
-表示標準輸入或標準輸出
例 zcat file.z| [cd/tmp ;tar xvf -]
前命令的結果可以作為后一個命令的輸入,稱為管道技術
例ps –ef | more
strings .*| grep user
作業調入前臺執行
fg %job
^z 使當前作業掛起
bg %job 使作業在后臺恢復執行
at 批作業
at time cmd
例 at 5pm Friday rm /tmp/*
4 UNIX文件和目錄結構
4.1 文件名和目錄名
必須遵守以下規則:
可采用除“1”外的任何ASCII字符
以“.”開頭的文件名在普通用戶看來是隱蔽的。
“.”代表當前目錄,“..”代表上級目錄。
特殊字符用反斜桿引導“\”
4.2 文件類型
l 普通文件
l 鏈
l 特殊文件,如終端、通信設備、驅動器、FIFO、SOCKET
4.3 文件系統結構
倒樹結構
/為根
4.4 目錄樹
/.文件系統的根目錄,超級用戶的HOME目錄
/stand UNIX引導時使用的標準程序和數據文件
/sbin UNIX引導時使用的程序
/dev 特殊設備文件
/dev/console 控制臺
/dev/lp 并口打印機
/dev/rz** 硬盤塊設備文件
/dev/rmton 磁帶文件
/etc 系統管理及配置數據庫
/opt 附加應用軟件包的根
/home 用戶主目錄和文件
/var 系統用文件、目錄、日志、記帳、郵件、假脫機
/var/adm 系統日志,記帳
/var/mail 用戶郵件文件
/var/news 新聞目錄
/var/opt 附加應用程序子目錄
/var/tmp 臨時文件
/var/spool 假脫機目錄
/var/uucp Uucp日志和狀態
/usr 其它用戶可訪問的根
/usr/bin 新的可執行程序命令
/usr/sbin 新的系統命令,可執行程序
/usr/lib 率
/usr/include 頭文件
/usr/examples 例子文件
/usr/share/man 聯機手冊
/usr/ucb 包含Bsd Unix兼容的軟件包
/usr/ibn 多國字符程序數據
4.5 目錄和文件的使用
絕對路徑名 以/開頭,從根開始
相對路徑名 其它以..,目錄名,文件名開始
UNIX命令 相應DOS命令
pwd 列出當前工作目錄 cd
ls 列目錄內容 dir/w
ls -l dir
ls -a dir/a
ls -r dir/s
ls -x dir/w
ls –l |more dir/p
ls –F 用符號表示簡單屬性
ls -q 用?表示非打印字符
cat 顯示文件內容
cat file type file
cat file1 file2 file3 type file1+file2+file3
cat -n file 顯示行號
cat -u file 顯示非打印字符 -u 輸出無緩沖
cat -r file 多個空行合為1行
cd 改變工作目錄
cd usr cd dos
cd /usr cd c:\dos
cd .. cd ..
cd ../.. cd ..\ ..
cd
mv 移動文件或目錄
mv file1 file2 ren file1 file2
mv file1 dir2 move file1 dir2
mv dir1 dir2 xcopy dir1 dir2 deltree dir1
mv –i 如果目標文件存在則提示
mv -f 強制拷貝
cp 拷貝文件
cp file1 file2 copy file1 file2
cp -i file1 file2 提示覆蓋
cp -r dir1 dir2 xcopy /s dir1 dir2
cp -p 屬性不變
cp file1 file2 file3 file4…target 合并文件
ln 建立軟鏈 dos 下只有用
ln source des norton tools 等工具才能實現,但chkdsk將檢查出錯誤。
ln -s source 符號連接忽略des屬性
ln -f source des
rm 刪除文件或目錄
rm file1 del file1
rm * del *.*
rm -r dir deltree dir
rm -i
rmdir 刪除目錄
條件:目錄必須是空目錄
rmdir dir rd dir
mkdir 創建子目錄
mkdir dir md dir
mkdir -m 指定使用mode
mkdir -p ../dir1/dir2/dir3
file 查看文件類型
file *
find 查找指定文件
find path expression
-print 打印文件所在路徑
-exec cmd 對找到的文件執行cmd命令
-atime n 只查幾天以前的文件
pg 分頁顯示文件
more 分頁顯示文件
lp 打印文件
lpstat 查看打印隊列
lprm 刪除打印作業
cancel
4.6 文件屬性
4.6.1 定義
$ ls –l
total 24094
-rw-r--r-- 1 root system 176584 Jul 5 17:09 3500install.pdf
-rw-r--r-- 1 root system 2593 Jun 13 12:48 DXsession
-rw-r--r-- 1 bin bin 2476 Apr 13 1999 GENERIC
lrwxr-xr-x 1 root system 7 May 31 16:41 bin -> usr/bin
…
…
-rw------- 1 root system 501 Jun 23 22:31 tcr2
drwxrwxrwt 3 root system 8192 Sep 3 12:59 tmp
drwxr-xr-x 29 root system 8192 Aug 31 14:22 usr
lrwxr-xr-x 1 root system 7 May 31 16:38 var -> usr/var
-rwxr-xr-x 1 root system 9549088 Jun 1 12:29 vmunix
$
使用ls –l命令顯示文件的全部屬性,其中第一個域反應文件的類型和訪問屬性,第1列為
- 表示為普通文件
d 表示為目錄文件
l 該文件為連接
第2,3,4列為文件屬主讀,寫,執行的訪問標識,如第2列為-則不可讀,為r 則表示可讀。
第5,6,7列為文件所屬組用戶的讀,寫,執行的訪問標識。
第8,9,10列為其它組用戶的讀,寫,執行的訪問標識。
第2個域為該文件的連接數,如果某目錄文件的連接數越大,其子目錄數就越多。
第3個域為該文件的屬主。
第4個域為該文件的屬組。
第5個域為該文件的大小。
第6個域為該文件的創建時間。
第7個域為該文件的文件名。
第8個域如果不空的活,則為該文件所連接文件路徑。
4.6.2 改變文件訪問屬性
$ chmod nnn file
$ chmod [ugo][+-][rwx] file
4.6.3 改變文件屬主
$ chown user file
$ chown user:group file
4.6.4 改變文件屬組
$ chgrp group file
4.6.5 更新文件訪問時間
$ touch file
5 命令,重定向,管道和過濾器
5.1 命令格式
cmd [ [-option [option value] …] [parameter1] [parameter2]….
每一條Shell命令由一個命令動詞或文件名開始,可以跟一個或多個命令選項,一個或多個命令叁數,按回車將命令提交到系統。大部分UNIX命令是一個可執行文件,位于環境變量PATH或path所指示的路徑中。命令也可以是shell內部命令,命令還可以是自己編譯連接的可執行文件或命令踋本(批處理)文件。一個命令行可以有65536個字符,如果一行寫不完,可用\符號續行,在命令行中可以采用*和%等通配符。
ls
ls –l
ls –l /usr
ls –l /etc/host*
在一個命令行中可以輸入多個命令,但必須用分號分隔開。
cd /usr/users/user01; ls –l; pwd
5.2 重定向
在缺省情況下,命令的輸入是標準輸入設備鍵盤,輸出是標準輸出設備如終端顯示器,可以通過>和<將命令的輸出和輸入重定向到文件或其它設備。
$ ls –l >dir.txt
$ more < .login
$ echo “” > /usr/sybase/sybase.log
在缺省情況下,使用>將命令寫到某文件中,如該文件不存在,本命令創建該文件,如果該文件存在,該文件的內容被本命令的輸出結果覆蓋。如果使用>>符號,則命令的輸出被添加到該文件的后面。
5.3 管道和過濾器
UNIX命令管理將一個命令的輸出作為另一個命令的輸入,在同一個命令行中有多個命令,后一個命令處理前一個命令的輸出。
ps –ef|grep oracle
以上命令查找命令行或用戶名中含有字符串oracle的輸出。 ps –ef命令輸出系統中所有進程的長格式信息,通過grep oracle命令處理后,不包括oracle的行全部被過濾掉了。象grep這種命令叫過濾器。其它過濾器命令如下:
wc 統計字數,行數,詞數
grep 按正規表達式進行模式檢索
-i 不區別大小寫
-v 不匹配的行
-n 行前加行號
-c 只輸出行數
-l 只輸出匹配的文件名
fgrep 只是字符串,含特殊字符時高速
grep 有限制的規則表達式,比較快
cgrep 完全正則表達式,功能最全
cut
-f 域
-d 分隔符
-b
colum 刪列
colum 3.5,textfuke 刪掉 3~9列
sort -b cdfmnru +關健字開始位置-關健字結束位置,輸入文件
-f 不區別大小寫
-m只合并
-r 降序
-u 多個相同行只輸出1行
uniq 多個重復行歸納為1行
join [-an.][-e串][-j(n)(m)][-o字段][-t字符]文件1文件2
-a與文件<n>不匹配的全輸出n=1,2
-e 無對應字段時輸出指定串
-jnm 將文件n的第m個字段作關鍵字進行連接
-o
6 UNIX命令匯總
6.1 alias 別名 ksh、csh命令
alias 顯示所有當前命令的別名
alias name 顯示別名為name的命令
alias name cmd 置cmd命令的別名為name csh
alias name=cmd 置cmd命令的別名為name ksh
6.2 unalias 取消別名
unalias name
6.3 bg %jobid 恢復掛起的作業到后臺運行
6.4 cal 顯示當前日的月歷
cal [[month]year]
cal 2 1996
6.5 chown owner file 改變文件屬性
chown -h 改變一文件鏈的屬性
chmod.chgrp
6.6 啟動一個cshell命令解釋程序
csh
6.7 date 顯示和設置日期
date mmddhhmm.yy設置月日時分年
6.8 echo string 在標準輸出上回顯string
6.9 env 顯示環境變量
env name=value 置環境變量name值為value
setenv
setenv name=value unsetenv name
6.10 exit 結束用戶登錄
6.11 export variable
在sh 和ksh下用戶變量export后才可成為全局變量
6.12 fg %jobid將掛起的作業調入前臺執行
6.13 fmt file 簡單正文格式化
fmt –w width 文件輸出的行寬為width
fmt –c 頂部對齊
fmt –s 防止短行合并輸出
6.14 head file 顯示文件頭部10行
head –n file 顯示頭部n 行
6.15 history 顯示以前被執行過的命令csh ,ksh
6.16 jobs 顯示所有運行的任務
在命令行尾加&使作業在后臺執行
正在執行作業時按ctrl-z (csh)使作業掛起
然后可用jobs,fg,bg等命令
6.17 kill pid 給進程發中止信號
kill-g pid 強制殺除進程
6.18 ksh 啟動ksh 命令解釋程序
ksh
6.19 more 命令
more file 分頁顯示file 內容
more –c 顯示前清屏
more –s 多個空行壓縮為1行
子命令
按空格:向前翻1屏
按回車:向前滾1行
b 回翻1屏
G 到多少行,缺省第1行 nG 到第n行
P% 到百分之一 np 到第n%處
m 標記一個位置 m[a-z] 命名位置
‘ 返回標記的位置 ‘[a-z]
v 運行editor 編輯文件
/.? 找一串
q exit
:n 跳到下一文件
:p 前1文件
6.20 news 查看新消息
news –a 顯示所有新消息狀態
news –n 顯示所有新消息狀態
6.21 nice cmd 以低于正常優先執行命令
nice =n cmd 設置優先級
6.22 mohup cmd cmd 命令執行時不掛起
6.23 r ksh 下重執行前1個命令
6.24 resume %jobid 啟動被掛起的作業
6.25 script file
將輸出、輸入到終端的信息同時寫入文件中,script –a 同時寫入文件中,-a是添加。
6.26 set 顯示當前變量值
set name=value
uset name
6.27 sh 啟動bsh
sh
6.28 spell file 查找文件的拼寫錯誤
spell –b 美國英語拼寫
6.29 stop %jobid 掛起正在運行的作業
6.30 stty 顯示設置終端選項
sttt –a 顯示當前終端所在選項
stty –g 顯示當前設置,格式可作為stty實參
line speed 置波特率
-t type 終端類型
columns n 設置列數
6.31 tail file 顯示文件最后10行
tail –n file 顯示文件最后n 行
6.32 tee file 將輸入復制到輸出及文件file中
tee –a file 添加到file 尾
6.33 touch file 更新文件的存取時間
touch –a 只更新訪問時間
touch –m 只更新修改時間
touch –c 防止建立以前不存在的文件
7 ed 編輯器
ed file
出錯時,h提供簡單幫助信息,H提供詳細幫助信息,用a,c,I進入輸入方式,在單獨一行上用,回到命令格式保存文件w. Wq =x
p .p 顯示當前行
= 顯示當前行的行號
np 顯示第n 行
1,6p 顯示1-6行
$p 顯示最后一行
1,$p顯示所有行
+ 顯示下一行
- 顯示上一行
n 顯示當前行及行號
nn 顯示第n行及行號
x,yn 顯示x—y行及行號
l 顯示當前行包括非打印字符
d 刪除當前行
u 取消最后命令
s /str1/str2 用 str2 取代str1
s/str1// 刪除str1
2s/str1/str2/n 第2 行的str1改為str2并顯示修改后的行
s/str1/str2/g 全程替換
<first>,<end>m<line>
2,4m6 第2—4行移到第6行之后
t 塊拷貝格式同m
r file 將文件讀到當前行后
<first>,<end> w file 寫塊到文件
!cmd 執行shell命令
/模式/ 正向查找命令
?模式?反向查找命令
// 繼續找第2個
g/the/p 全程查找并顯示
g/the/s/the/that/ 全程查找the并用that代替the
v與g命令相反
v/the/n 全程查找不包含the 并顯示
無字符
^代表行首 $行尾 .任意字符 *任意多個與前面相同字符
/A….B/ 以A開關B結尾中間3個任意
. s/. /. 第1個 . 當前行
第2 個 . 任意字符
第3個 . 字符
s/xx*/y/ 用y代替2個或2個以上的x
s/x*y/y/ 用y代替以x開頭以y結束的所有字符
&代表第1個模式內容
/模式1/(模式1)/=/模式1/(&)/
[xz]表示x或z
[0-9]表示0-9的任意數字
8 vi編輯器
vi file vi -r 只讀模式 vi -r 恢復 -wnumber 指定窗 口大小
vi +67 file 光標停在第67行
命令模式 i,I,o,O,a,A進入輸入模式,;/?最后一行模式
最后一行模式
:q 退出 :w寫文件 :wq存盤退出 :q! Quit :x存盤退出
命令模式 zz存盤退出 如未修改不存盤退出
移動光標
l 空格 右 w W 下詞詞首 5w 前移5個詞
h ^H 左 e E 詞尾或標點
j ^N 下 b B 返回詞首
k ^P 上 ) 下句句首
0 行首 ( 上句句首
& 行尾 } 下段句首
+ 下行行首 { 上段名首
- 上行行首 ]] 下區第1字符
[[ 上區第1字符
H 光標到屏幕布頂部
M 光標到屏幕布中部
L 光標到屏幕布底部
ctrl -F 向前一屏
^D 向前半屏
^B 向后一屏
^U 向后半屏
^Y 向上滾1行
^E 向下滾1行
G 文件尾, nG到第n 行
z+ 向上翻頁
z^ 向下翻頁
z. 當前行到中間
z- 當前行到底部
rn 用字符n代替當前字符
3rn 用n代替當前3個字符
Rstring ESC 用輸入串代替當前字符
cw string ESC 用string代替當前光標到詞尾的串
5cw string ESC 用string代替當前光標到第5個詞尾的串
cb,CB string ESC用string替換詞首到當前光標位置的串
c&string ESC 用string替換到行尾的字串
s刪當前字符并開始輸入正文
S 刪當前行并開始輸入正文
~ 改變當前字符大小寫
x 刪當前字符
X 刪當前字符左邊的字符
dw 刪光標到詞尾的串
d :return=dd 刪兩行
d [[ 刪光標到區首
D=d&
fn 移到跟當前光標后面的“n”字符處
Fn 移到跟當前光標前面的“n”字符處
fn 移到跟當前光標后面的“n”字符前一列
Fn 移到跟當前光標前面的“n”字符后一列
; 繼續f,F,t,T查找
, 反向f,F,t,T查找
:addr 到指定行
:set nu 當前緩沖區加行號
m [a-z] 做標記
‘a 返回原記號處
ecol 定位到指定行
J 光標所在行與下行合并
u 取消前次操作
U 光標未離開當前行之首,取消從光標移來所做的修改
p 將緩沖區內容插入光標右邊,添加新行
:e! 取消最后一次寫文件以來所做的所有修改
. 重復上一個命令
9 圖形界面
9.1 進入系統
在此輸入用戶名,按回車
在此輸入口令,按回車進入系統
在此可選擇你所熟悉的語言環境
進入系統后,可用dtterm,DECterm,Xterm等仿真終端,輸入UNIX命令。
9.2 終端仿真 dtterm Decterm
9.3 輸入法設置
選擇默認輸入法,指定啟動和停止輸入法的熱鍵,各種輸入法的切換熱鍵。退出系統并重新登錄后,設置生效。
9.4 編輯器
操作與PC機Notepad完全相同
9.5 其它X實用程序
在程序組中有多級程序組。
10 編程
10.1 DEC FORTRAN
F77 [option] filename [option]
源文件以.f,.for,.FOR結尾
目標文件以.o結尾
.F結束的文件必須先用C予處理程序處理
.r和.E解釋為ratfor或ef1源程序
被 cpp予處理過的源程序
.options
-o output 生成目標文件名
-v 生成l列表文件
-w1 列警告信息,包括未被使用的變量
-W
-cross-reference 列表中含交叉索引
-c 強制生成目標文件,而不生成或執行代碼
-d-lines 編譯第1列為D的行
-go 無符號信息
-g1 應跟蹤信息,行信息缺省
-g2或-g 應符號調試信息和跟蹤信息自設置 O。
-g3 應符號調試信息和跟蹤信息但調試信息不精確
-machine-code 在列表中顯示機器語言信息
-o0 無優化
-o1 局部優化
-o2 全局優化包含o1
-o3 附加全局優化包含o2
-o4或o包含內部行擴展包含o3
-o5 軟件管道優化
-om 連接后優化
-tune generic ︱host︱ev4︱ev5
改進針對本機或本cpu的性能,其它cpu下降
-show code 顯示機器代碼
-show include 顯示include文件中語句
-show nomap 無符號表示
-show xvef
-warn argument-checking
-warn declaretions
-warn noalignments
-worn nogenerl
-warn nouncalled
-warn nouninitialized
-warn nounreachable
-warn truncated-sourse
-warn unused
-convert cray
-convert IBM
10.2 dbx技巧
dbx和ladebug都是UNIX下調試程序
ladebug是DEC開發的增強型符號調試程序
ladebug a.out
help 查看聯機幫助
help cmd
alias 查看和設置別名
print 顯示變量或內存串值
ox140001000/100x 轉貯內存
x 長字 xx雙字 x字 s串 c字符 I機內代碼
where 在堆棧中尋找變量值
ro 為函數返回值
r16 函數變量1
r17 函數變量2
…
r20 函數變量5
多于5個變量被壓入棧
assign 改變內存值
print* (long *) ox11fffff20
ox632f73756c 70322d
assign ox11fffff20=17
ox17
print* (long *)ox11fffff20
ox17
stop in stop in
stopat
file
step stepi
next nexti
cont conti
w wi
l li
程序代碼位置 ox120000000
數據代碼 ox140000000
set &hexin=1 所在輸入均為16進制
set &hexints=1 所在輸出均為16進制
&curpc
&curline
use /dir1/dir2/…
startddr,endaddr/mode
startddr,endaddr/count mode
d 10進制word
D 10進制long
o八進制word
O 八進制long
x 十六進制 word
X 十六進制 long
b 八進制 byte
c 字符 byte
s 串 Asciz
f 單精度 real
g 雙精度 real
i 反匯編 指令
# 解釋
!string ?string 串查找
alias ,unalias
予定義的別名
a assign f func
b stop at h history
bp stop in j status
d delete li &curpc/10I;&curpc=&curpc+40
l list
n next q quit
u: nexti r rerun
p print ri record input
pd printf “%d” ro recond ouput
po printf “%o” s step
pr printregs si stepi
ps printf “%s” u list &curline-9:10
px printf “ox%x” w list &curline-5:10
wi &curpc-20/10i W list &curline-10:20
what is 變量 delet all
where is 變量 file
which 變量 goto line
patch f00=20
patch f00=20 catch ignore信號
trace at set,useset
return source 文件名
attach
dbxinit 文件,初始化命令,設置,
10.3 make ,makefile, Makefile s.makefile
例:persee:persee.for cudl:a.o l:b.o
f>>-c-g-i8-r8-dorble-size128-g\
-convert=cray persee.for cudl:u.0 l:b.0
cndl:u.o:cndl:u.for
f>>-c-g-i8-r8-double-size128-convert=cray\cndliu.for
l:b.o:lb.for
f>>-c-g-i8-r8-double-size128-convert=cray\l:b.for
make -b 兼容老版makefile
-d Debug 模式
-f makefile
l:b:l:b(file1.0)l:b(file2.0) l:b(file3.0)
.c.a:
&(cc)-c&(CFLAGS1)&<
ar rv $@ $*.0
rm-f $*.0
10.4 使用軟盤
n 軟盤文件系統
$ fddisk -fmt /dev/rfdoa
$ fddisk -fmt -f /dev /rfdoc
$ newfs /dev/fd0c rx23
$ mount /dev/fd0c /mnt
$ cp file /mnt
$ umont /mnt
n DOS格式軟盤
# ln –s /dev/rfd0c /dev/fddrive
$ /usr/bin/mtools/mdir
$ /usr/bin/mtools/mcopy file a:
n 原始格式
$ tar cvf /dev/rfd0a mydirs
11 UNIX藝術
對UNIX使用時間越長,對UNIX的了解就越深入,剛開始使用時,每天都有新的發現,二三年以后逐漸開成自己的風格。
使用UNIX是一種藝術享受,而不是攔路虎,通向藝術之路。
11.1 選擇你鐘愛shell
每一種shell都是進入時初始執行文件。
sh ksh profile
csh login cshrc
/etc下 csh.login 所有csh用戶進入時初始化
設置環境變量
設置path和manpath
設置終端參數
執行用戶命令
賦置別名
例: csh 保存歷史
.login set savehist=40
set term=vt320 set proupt=“hostmane\!.”
set editmode=emacs
set prompt=“‘whomni’ @‘hostname’\!>”
set history=100
setenv lang=zh.cn
Ksh profile
SYBASE=/usr/sybase
DS2UERY=SYBASE
EXPORT.SYBASE DS2UERY
alias 別名
alias dir ls
alias type cat
alias move “mu-i”
alias del rm
alias md mkdir
alias rd rmdir
alias deltree “rm –r”
alias ren mv
alias cipy “cp-i”
alias xcopy “cp-r”
11.2 使目錄間轉換更容易
set cdpath=(/usr/rsers/rser1/persee /usr/users/user1/conpate/mut /usr/examples/motif/cpuinfo)
%pwd
%/usr/users/user1
%cd mut
%pwd
%/mut
%cd persee
%pwd
/usr/users/user1/persen
pushd popd dirs
pwd
/usr/inolude
poshd sys
pwd /usr/include/sys
pushd /usr/users/user01
popd +1
pwd
11.3 電子郵件來時通知
unset mail
biff y xbiff
12 TCP/IP網絡簡介
12.1 IP地址
ping 195.1.1.1
ftp 195.1.1.1
telnet 195.1.1.1
使用機器名,hosts中維持1個名稱和地址轉換數據庫格式
195.1.1.0 網絡名
195.1.1.1 主機名
12.2 ftp 使用
ftp 主機/地址
user
password
ascii binary cd lcd pwd ls lpwd get put mget mput prompt vervose bye oper bye close help
12.3 telnet終端仿真
telnet hostname
Digital UNIX (dec3000.newdesign.com.cn) (ttyp1)
login: user1
passwd:
$
設置終端屬性:
$ TERM=vt100
$ export TERM
$ stty erase ‘^?’
12.4 X終端仿真
Huminbird Exceed
執行Xconfig,選擇Communication->XDMCP-broadcast->OK,啟動EXCEED,可以看到UNIX主機已在列表中。點擊進入。
eXcursion
執行eXcursion control panel選擇XDMCP->Enable XDMCP->選擇XDMCPbroadcast,啟動eXcursion,點擊進入想連接的UNIX主機。
13 UNIX的批處理 Shell Script
13.1 前言
在DOS 中,你可能會從事一些例行的重覆性工作,此時你會將這些重覆性的命令寫成批次檔,只要執行這個批次檔就等於執行這些命令。大家會問在UNIX中是否有批次處理這個東東,答案是有的。在UNIX中不只有如DOS 的批次處理,它的功能比起DOS 更強大,相對地也較復雜,已經和一般的高階語言不相上下。在UNIX中大家都不叫做批次檔,而叫做Shell Script。
一般而言,Shell Script的地位和其它的可執行檔(或命令)是完全相同的,只不過Shell Script是以文字檔的方式儲存,而非二進位檔。而執行Shell Script時,必須有一個程式將其內容轉成一道道的命令執行,而這個程式其實就是Shell ,這也就是為什麼我們叫做Shell Script的原因(往後我們稱為Script)。不同Shell 的Script基本上會有一些差異,所以我們不能將寫給A shell 的Script用B shell 執行。而在UNIX中大家最常使用Bourne Shell以及C Shell ,所以這堂課就介紹這兩種Script的寫法。
13.2 將文字檔設為可執行的Shell Script
如果我們已經寫好Script,如何將其設成可執行檔呢?因為Script其實是一個可執行檔,所以必須將其存取權設定成可執行。我們可以使用下列命令更改存取權:
chmod u+x filename 只有自己可以執行,其它人不能執行
chmod ug+x filename 只有自己以及同一群可以執行,其它人不能執行
chmod +x filename 所有人都可以執行
而我們如何指定使用那一個Shell 來解釋所寫的Script呢?幾種基本的指定方式如下所述:
1. 如果Script的第一個非空白字元不是"#",則它會使用Bourne Shell。
2. 如果Script的第一個非空白字元是"#"時,但不以"#!"開頭時,則它會使用C Shell。
3. 如果Script以"#!"開頭,則"#!"後面所寫的就是所使用的Shell,而且要將整個路徑名稱指出來。
這里建議使用第三種方式指定Shell ,以確保所執行的就是所要的。Bourne Shell的路徑名稱為/bin/sh ,而C Shell 則為/bin/csh。
<eg>
1. 使用Bourne Shell
2. 使用C Shell
3. 使用/etc/perl
除了在Script內指定所使用的Shell 外,你也可以在命令列中強制指定。比如你要用C Shell 執行某個Script,你可以下這個命令:
csh filename
此時的Script的存取權就不一定要為可執行檔,其內部所指定的Shell 也會無效,詳細的情形後面會討論。
13.3 Script的基本結構及觀念
Script是以行為單位,我們所寫的Script會被分解成一行一行來執行。而每一行可以是命令、注解、或是流程控制指令等。如果某一行尚未完成,可以在行末加上"\" ,這個時候下一行的內容就會接到這一行的後面,成為同一行,如下
當Script中出現"#" 時,再它後面的同一行文字即為注解,Shell 不會對其翻譯。
在Script中要執行一個命令的方法和在命令列中一樣,你可以前景或背景執行,執行命令時也會需要設定一些環境變數。
Script的流程控制和一般高階語言的流程控制沒有什麼兩樣,也和高階語言一樣有副程式。這些使得Script的功能更加強大。
為了達到與高階語言相同的效果,我們也可以在Script中設定變數,如此使Script成為一個名付其實的高階語言。
13.4 Bourne Shell
13.4.1 變數
Bourne Shell的變數型態只有字串變數,所以要使用數值運算則必須靠外部命令達成目的。而其變數種類有下列幾種:
1) 使用者變數
這是最常使用的變數,我們可以任何不包含空白字元的字串來當做變數名稱。
設定變數值時則用下列方式:
var=string
取用變數時則在變數名稱前加上一"$" 號。
<eg>
結果如下:
name
Tom
2) 系統變數(環境變數)
和使用者變數相似,只不過此種變數會將其值傳給其所執行的命令。要將一使用者變數設定為系統變數,只要加上:
export var
<eg>
┌———————┐
以下是使用者一進入系統之後就已設定好的系統變數:
$HOME 使用者自己的目錄
$PATH 執行命令時所搜尋的目錄
$TZ 時區
$MAILCHECK 每隔多少秒檢查是否有新的信件
$PS1 在命令列時的提示號
$PS2 當命令尚未打完時,Shell 要求再輸入時的提示號
$MANPATH man 指令的搜尋路徑
3) 唯讀的使用者變數
和使用者變數相似,只不過這些變數不能被改變。要將使用者變數設成唯讀的,只要加上:
readonly var
而若只打readonly則會列出所有唯讀的變數。還有一點,系統變數不可以設定成唯讀的。
<eg>
結果如下:
Tom
name: is read only
readonly name
readonly ......
4) 特殊變數
有些變數是一開始執行Script時就會設定,并且不以加以修改,但我們不叫它唯讀的系統變數,而叫它特殊變數(有些書會叫它唯讀的系統變數),因為這些變數是一執行程式時就有了,況且使用者無法將一般的系統變數設定成唯讀的。以下是一些等殊變數:
這個程式的執行名字
$n 這個程式的第n個參數值,n=1..9
$* 這個程式的所有參數
$# 這個程式的參數個數
$$ 這個程式的PID
$! 執行上一個背景指令的PID
$? 執行上一個指令的返回值
當你執行這個程式時的參數數目超過9 個時,我們可以使用shift 命令將參數往前移一格,如此即可使用第10個以後的參數。除此之外,我們可以用set 命令改變$n及$*,方法如下:
set string
如此$*的值即為string,而分解後則會放入$n。如果set 命令後面沒有參數,則會列出所有已經設定的變數以及其值。
<eg>
檔名:ex1 參數:this is a test
結果如下:
Filename: ex1
Arguments: this is a test
No. of args.: 4
2nd arg.: is
No. of args.: 3
2nd arg.: a
Arguments: hello, everyone
2nd arg.: everyone
值得一提的是,當你想從鍵盤輸入一變數值時,你可以使用下面的命令:
read var1 var2.....
這時read會將一個字分給一個變數。如果輸入的字比變數還多,最後一個變數會將剩下的字當成其值。如果輸入的字比變數還少,則後面的變數會設成空字串。
如果需要處理數值運算,我們可以使用expr命令。其參數及輸出列於附錄A。
13.4.2 執行命令
在Bourne Shell中有五種方法執行一個命令,而這五種方式所產生的果有些許的不同。
1) 直接下命令
這個方式和在命令列中直接下命令的效果一樣。
2) 使用sh命令
sh command
這個檔案必須是Bourne Shell的Script,但這個檔案并不一定要設成可執行。
除此之外和直接下命令的方式一樣。
3) 使用"."命令
. command
這時和使用sh命令相似,只不過它不像sh一般會產生新的process ,相反地,它會在原有的process 下完成工作。
4) 使用exec命令
exec command
此時這個Script將會被所執行的命令所取代。當這個命令執行完畢之後,這個Script也會隨之結束。
5) 使用命令替換
這是一個相當有用的方法。如果想要使某個命令的輸出成為另一個命令的參數時,就一定要使用這個方法。我們將命令列於兩個"`" 號之間,而Shell 會以這個命令執行後的輸出結果代替這個命令以及兩個"`" 符號。
<eg>
str='Current directory is '`pwd`
echo $str
結果如下:
Current directory is /users/cc/mgtsai
這個意思是pwd 這個命令輸出"/users/cc/mgtsai",而後整個字串代替原來的`pwd` 設定str 變數,所以str 變數的內容則會有pwd 命令的輸出。
<eg>
number=`expr $number + 1`
這就是先前所提要作數值運算的方法,基本上expr命令只將運算式解,而後輸出到標準輸出上。如果要將某變數設定成其值,非得靠命令替換的方 式不可。這個例子是將number變數的值加1 後再存回number變數。
13.4.3 流程控制
在介紹流程控制之前,我們先來看看test命令。test命令的參數是條件判斷式,當條件為真時則傳回非零值,而條件為偽時則傳回零。在所有的流程控制都必須用到test命令來判斷真偽。而test命令的使用方法則列於附錄B。
<eg>
test $# = 0
如果執行這個程式沒有參數時,會傳回非零值代表"$# = 0"這個條件成立。反之則會傳回零。
以下介紹各種流程控制:
1) if then
語法如下
if (condition)
then
then-commands
fi
condition 是一個test命令。往後所介紹的各種流程中的condition 都是test命令。
<eg>
檔名:chkarg
$ chkarg Hello
Arg1: Hello
$ chkarg
$
2) if then else
語法以及流程圖如下
│ FALSE
if (condition) <condition>————————┐
then │TRUE │
then-commands then-commands else-commands
else ├—————————┘
else-commands │
fi
3) if then elif
語法以及流程圖如下
│ FALSE
if (condition1) <condition1>———┐
then │TRUE │ FALSE
commands1 commands1 <condition2>┐
elif (condition2) │ │TRUE │
then │ commands2 commands3
commands2 ├—————┴—————┘
else │
commands3
commands3
fi
<eg>
echo 'word 1: \c'
read word1
echo 'word 2: \c'
read word2
echo 'word 3: \c'
read word3
if (test "$word1" = "$word2" -a "$word2" = "$word3")
then
echo 'Match: words 1, 2, & 3'
elif (test "$word1" = "$word2")
then
echo 'Match: words 1 & 2'
elif (test "$word1" = "$word3")
then
echo 'Match: words 1 & 3'
elif (test "$word2" = "$word3")
then
echo 'Match: words 2 & 3'
else
echo 'No match'
fi
4) for in
語法以及流程圖如下