<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評論-209  文章-0  trackbacks-0
     

    Java語法總結(jié) - 線程

    Posted on 2007-10-25 23:53 Raylong 閱讀(3747) 評論(10)  編輯  收藏 所屬分類: Java語法總結(jié)
    Java語法總結(jié) - 線程

    一提到線程好像是件很麻煩很復雜的事,事實上確實如此,涉及到線程的編程是很講究技巧的。這就需要我們變換思維方式,了解線程機制的比較通用的技巧,寫出高效的、不依賴于某個JVM實現(xiàn)的程序來。畢竟僅僅就Java而言,各個虛擬機的實現(xiàn)是不同的。學習線程時,最令我印象深刻的就是那種不確定性、沒有保障性,各個線程的運行完全是以不可預料的方式和速度推進,有的一個程序運行了N次,其結(jié)果差異性很大。


    1、什么是線程?線程是彼此互相獨立的、能獨立運行的子任務,并且每個線程都有自己的調(diào)用棧。所謂的多任務是通過周期性地將CPU時間片切換到不同的子任務,雖然從微觀上看來,單核的CPU上同時只運行一個子任務,但是從宏觀來看,每個子任務似乎是同時連續(xù)運行的。(但是JAVA的線程不是按時間片分配的,在本文的最后引用了一段網(wǎng)友翻譯的JAVA原著中對線程的理解。)

    2、在java中,線程指兩個不同的內(nèi)容:一是java.lang.Thread類的一個對象;另外也可以指線程的執(zhí)行。線程對象和其他的對象一樣,在堆上創(chuàng)建、運行、死亡。但不同之處是線程的執(zhí)行是一個輕量級的進程,有它自己的調(diào)用棧。
    可以這樣想,每個調(diào)用棧都對應一個線程,每個線程又對應一個調(diào)用棧。
    我們運行java程序時有一個入口函數(shù)main()函數(shù),它對應的線程被稱為主線程。一個新線程一旦被創(chuàng)建,就產(chǎn)生一個新調(diào)用棧,從原主線程中脫離,也就是與主線程并發(fā)執(zhí)行。


    4、當提到線程時,很少是有保障的。我們必須了解到什么是有保障的操作,什么是無保障的操作,以便設計的程序在各種jvm上都能很好地工作。比如,在某些jvm實現(xiàn)中,把java線程映射為本地操作系統(tǒng)的線程。這是java核心的一部分。

    5、線程的創(chuàng)建。
    創(chuàng)建線程有兩種方式:
    A、繼承java.lang.Thread類。
        class ThreadTest extends Thread{
            public void run() {
                System.out.println ("someting run here!");
            }
            public void run(String s){
                System.out.println ("string in run is " + s);
            }
            public static void main (String[] args) {
                ThreadTest tt = new ThreadTest();
                tt.start();
                tt.run("it won't auto run!");
            }
        }

    輸出的結(jié)果比較有趣:
    string in run is it won't auto run!
    someting run here!
    注意輸出的順序:好像與我們想象的順序相反了!為什么呢?
    一旦調(diào)用start()方法,必須給JVM點時間,讓它配置進程。而在它配置完成之前,重載的run(String s)方法被調(diào)用了,結(jié)果反而先輸出了“string in run is it won't auto run!”,這時tt線程完成了配置,輸出了“someting run here!”。
    這個結(jié)論是比較容易驗證的:
    修改上面的程序,在tt.start();后面加上語句for (int i = 0; i<10000; i++); 這樣主線程開始執(zhí)行運算量比較大的for循環(huán)了,只有執(zhí)行完for循環(huán)才能運行后面的tt.run("it won't auto run!");語句。此時,tt線程和主線程并行執(zhí)行了,已經(jīng)有足夠的時間完成線程的配置!因此先到一步!修改后的程序運行結(jié)果如下:
    someting run here!
    string in run is it won't auto run!
    注意:這種輸出結(jié)果的順序是沒有保障的!不要依賴這種結(jié)論!

    沒有參數(shù)的run()方法是自動被調(diào)用的,而帶參數(shù)的run()是被重載的,必須顯式調(diào)用。
    這種方式的限制是:這種方式很簡單,但不是個好的方案。如果繼承了Thread類,那么就不能繼承其他的類了,java是單繼承結(jié)構(gòu)的,應該把繼承的機會留給別的類。除非因為你有線程特有的更多的操作。
    Thread類中有許多管理線程的方法,包括創(chuàng)建、啟動和暫停它們。所有的操作都是從run()方法開始,并且在run()方法內(nèi)編寫需要在獨立線程內(nèi)執(zhí)行的代碼。run()方法可以調(diào)用其他方法,但是執(zhí)行的線程總是通過調(diào)用run()。

    B、實現(xiàn)java.lang.Runnable接口。
        class ThreadTest implements Runnable {
            public void run() {
                System.out.println ("someting run here");
            }
            public static void main (String[] args) {
                ThreadTest tt = new ThreadTest();
            Thread t1 = new Thread(tt);
            Thread t2 = new Thread(tt);
            t1.start();
            t2.start();
                //new Thread(tt).start();
            }
        }

    比第一種方法復雜一點,為了使代碼被獨立的線程運行,還需要一個Thread對象。這樣就把線程相關的代碼和線程要執(zhí)行的代碼分離開來。

    另一種方式是:參數(shù)形式的匿名內(nèi)部類創(chuàng)建方式,也是比較常見的。
        class ThreadTest{
            public static void main (String[] args) {
                Thread t = new Thread(new Runnable(){
                    public void run(){
                        System.out.println ("anonymous thread");
                    }
                });    
                
                t.start();
            }
        }
    如果你對此方式的聲明不感冒,請參看本人總結(jié)的內(nèi)部類。

    第一種方式使用無參構(gòu)造函數(shù)創(chuàng)建線程,則當線程開始工作時,它將調(diào)用自己的run()方法。
    第二種方式使用帶參數(shù)的構(gòu)造函數(shù)創(chuàng)建線程,因為你要告訴這個新線程使用你的run()方法,而不是它自己的。
    如上例,可以把一個目標賦給多個線程,這意味著幾個執(zhí)行線程將運行完全相同的作業(yè)。

    6、什么時候線程是活的?
    在調(diào)用start()方法開始執(zhí)行線程之前,線程的狀態(tài)還不是活的。測試程序如下:
        class ThreadTest implements Runnable {
            public void run() {
                System.out.println ("someting run here");
            }
            public static void main (String[] args) {
                ThreadTest tt = new ThreadTest();
                Thread t1 = new Thread(tt);
                System.out.println (t1.isAlive());
                t1.start();
                System.out.println (t1.isAlive());
            }
        }

    結(jié)果輸出:
    false
    true
    isAlive方法是確定一個線程是否已經(jīng)啟動,而且還沒完成run()方法內(nèi)代碼的最好方法。

    7、啟動新線程。
    線程的啟動要調(diào)用start()方法,只有這樣才能創(chuàng)建新的調(diào)用棧。而直接調(diào)用run()方法的話,就不會創(chuàng)建新的調(diào)用棧,也就不會創(chuàng)建新的線程,run()方法就與普通的方法沒什么兩樣了!

    8、給線程起個有意義的名字。
    沒有該線程命名的話,線程會有一個默認的名字,格式是:“Thread-”加上線程的序號,如:Thread-0
    這看起來可讀性不好,不能從名字分辨出該線程具有什么功能。下面是給線程命名的方式。
    第一種:用setName()函數(shù)
    第二種:選用帶線程命名的構(gòu)造器
        class ThreadTest implements Runnable{
            public void run(){
                System.out.println (Thread.currentThread().getName());
            }
            public static void main (String[] args) {
            ThreadTest tt = new ThreadTest();     
            //Thread t = new Thread (tt,"eat apple");
            Thread t = new Thread (tt);
            t.setName("eat apple");
            t.start();
            }
        }

    9、“沒有保障”的多線程的運行。下面的代碼可能令人印象深刻。
        class ThreadTest implements Runnable{
            public void run(){
                System.out.println (Thread.currentThread().getName());
            }
            public static void main (String[] args) {
                ThreadTest tt = new ThreadTest();
                Thread[] ts =new Thread[10];
            
                for (int i =0; i < ts.length; i++)
                    ts[i] = new Thread(tt);
                    
                for (Thread t : ts)
                    t.start();
            }
        }
    在我的電腦上運行的結(jié)果是:
    Thread-0
    Thread-1
    Thread-3
    Thread-5
    Thread-2
    Thread-7
    Thread-4
    Thread-9
    Thread-6
    Thread-8
    而且每次運行的結(jié)果都是不同的!繼續(xù)引用前面的話,一旦涉及到線程,其運行多半是沒有保障。這個保障是指線程的運行完全是由調(diào)度程序控制的,我們沒法控制它的執(zhí)行順序,持續(xù)時間也沒有保障,有著不可預料的結(jié)果。


    10、線程的狀態(tài)。
    A、新狀態(tài)。
    實例化Thread對象,但沒有調(diào)用start()方法時的狀態(tài)。
    ThreadTest tt = new ThreadTest();     
    或者Thread t = new Thread (tt);
    此時雖然創(chuàng)建了Thread對象,如前所述,但是它們不是活的,不能通過isAlive()測試。

    B、就緒狀態(tài)。
    線程有資格運行,但調(diào)度程序還沒有把它選為運行線程所處的狀態(tài)。也就是具備了運行的條件,一旦被選中馬上就能運行。
    也是調(diào)用start()方法后但沒運行的狀態(tài)。此時雖然沒在運行,但是被認為是活的,能通過isAlive()測試。而且在線程運行之后、或者被阻塞、等待或者睡眠狀態(tài)回來之后,線程首先進入就緒狀態(tài)。

    C、運行狀態(tài)。
    從就緒狀態(tài)池(注意不是隊列,是池)中選擇一個為當前執(zhí)行進程時,該線程所處的狀態(tài)。

    D、等待、阻塞、睡眠狀態(tài)。
    這三種狀態(tài)有一個共同點:線程依然是活的,但是缺少運行的條件,一旦具備了條就就可以轉(zhuǎn)為就緒狀態(tài)(不能直接轉(zhuǎn)為運行狀態(tài))。另外,suspend()和stop()方法已經(jīng)被廢棄了,比較危險,不要再用了。

    E、死亡狀態(tài)。
    一個線程的run()方法運行結(jié)束,那么該線程完成其歷史使命,它的棧結(jié)構(gòu)將解散,也就是死亡了。但是它仍然是一個Thread對象,我們?nèi)钥梢砸盟拖衿渌麑ο笠粯樱∷膊粫焕厥掌骰厥樟耍驗閷υ搶ο蟮囊萌匀淮嬖凇?br /> 如此說來,即使run()方法運行結(jié)束線程也沒有死啊!事實是,一旦線程死去,它就永遠不能重新啟動了,也就是說,不能再用start()方法讓它運行起來!如果強來的話會拋出IllegalThreadStateException異常。如:
    t.start();
    t.start();
    放棄吧,人工呼吸或者心臟起搏器都無濟于事……線程也屬于一次性用品。

    11、阻止線程運行。
    A、睡眠。sleep()方法
    讓線程睡眠的理由很多,比如:認為該線程運行得太快,需要減緩一下,以便和其他線程協(xié)調(diào);查詢當時的股票價格,每睡5分鐘查詢一次,可以節(jié)省帶寬,而且即時性要求也不那么高。
    用Thread的靜態(tài)方法可以實現(xiàn)Thread.sleep(5*60*1000); 睡上5分鐘吧。sleep的參數(shù)是毫秒。但是要注意sleep()方法會拋出檢查異常InterruptedException,對于檢查異常,我們要么聲明,要么使用處理程序。
        try {
            Thread.sleep(20000);
        }
        catch (InterruptedException ie) {
            ie.printStackTrace();
        }
    既然有了sleep()方法,我們是不是可以控制線程的執(zhí)行順序了!每個線程執(zhí)行完畢都睡上一覺?這樣就能控制線程的運行順序了,下面是書上的一個例子:
        class ThreadTest implements Runnable{
            public void run(){
                for (int i = 1; i<4; i++){
                    System.out.println (Thread.currentThread().getName());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ie) { }
                }
            }
            public static void main (String[] args) {
                ThreadTest tt = new ThreadTest();
                Thread t0 = new Thread(tt,"Thread 0");
                Thread t1 = new Thread(tt,"Thread 1");
                Thread t2 = new Thread(tt,"Thread 2");
                t0.start();
                t1.start();
                t2.start();            
            }
        }

    并且給出了結(jié)果:
    Thread 0
    Thread 1
    Thread 2
    Thread 0
    Thread 1
    Thread 2
    Thread 0
    Thread 1
    Thread 2
    也就是Thread 0  Thread 1 Thread 2 按照這個順序交替出現(xiàn),作者指出雖然結(jié)果和我們預料的似乎相同,但是這個結(jié)果是不可靠的。果然被我的雙核電腦驗證了:
    Thread 0
    Thread 1
    Thread 2
    Thread 2
    Thread 0
    Thread 1
    Thread 1
    Thread 0
    Thread 2
    看來線程真的很不可靠啊。但是盡管如此,sleep()方法仍然是保證所有線程都有運行機會的最好方法。至少它保證了一個線程進入運行之后不會一直到運行完位置。

    時間的精確性。再強調(diào)一下,線程醒來之后不會進入運行狀態(tài),而是進入就緒狀態(tài)。因此sleep()中指定的時間不是線程不運行的精確時間!不能依賴sleep()方法提供十分精確的定時。我們可以看到很多應用程序用sleep()作為定時器,而且沒什么不好的,確實如此,但是我們一定要知道sleep()不能保證線程醒來就能馬上進入運行狀態(tài),是不精確的。

    sleep()方法是一個靜態(tài)的方法,它所指的是當前正在執(zhí)行的線程休眠一個毫秒數(shù)。看到某些書上的Thread.currentThread().sleep(1000); ,其實是不必要的。Thread.sleep(1000);就可以了。類似于getName()方法不是靜態(tài)方法,它必須針對具體某個線程對象,這時用取得當前線程的方法Thread.currentThread().getName();

    B、線程優(yōu)先級和讓步。
    線程的優(yōu)先級。在大多數(shù)jvm實現(xiàn)中調(diào)度程序使用基于線程優(yōu)先級的搶先調(diào)度機制。如果一個線程進入可運行狀態(tài),并且它比池中的任何其他線程和當前運行的進程的具有更高的優(yōu)先級,則優(yōu)先級較低的線程進入可運行狀態(tài),最高優(yōu)先級的線程被選擇去執(zhí)行。

    于是就有了這樣的結(jié)論:當前運行線程的優(yōu)先級通常不會比池中任何線程的優(yōu)先級低。但是并不是所有的jvm的調(diào)度都這樣,因此一定不能依賴于線程優(yōu)先級來保證程序的正確操作,這仍然是沒有保障的,要把線程優(yōu)先級用作一種提高程序效率的方法,并且這種方法也不能依賴優(yōu)先級的操作。

    另外一個沒有保障的操作是:當前運行的線程與池中的線程,或者池中的線程具有相同的優(yōu)先級時,JVM的調(diào)度實現(xiàn)會選擇它喜歡的線程。也許是選擇一個去運行,直至其完成;或者用分配時間片的方式,為每個線程提供均等的機會。

    優(yōu)先級用正整數(shù)設置,通常為1-10,JVM從不會改變一個線程的優(yōu)先級。默認情況下,優(yōu)先級是5。Thread類具有三個定義線程優(yōu)先級范圍的靜態(tài)最終常量:Thread.MIN_PRIORITY (為1) Thread.NORM_PRIORITY (為5) Thread.MAX_PRIORITY (為10)

    靜態(tài)Thread.yield()方法。
    它的作用是讓當前運行的線程回到可運行狀態(tài),以便讓具有同等優(yōu)先級的其他線程運行。用yield()方法的目的是讓同等優(yōu)先級的線程能適當?shù)剌嗈D(zhuǎn)。但是,并不能保證達到此效果!因為,即使當前變成可運行狀態(tài),可是還有可能再次被JVM選中!也就是連任。

    非靜態(tài)join()方法。
    讓一個線程加入到另一個線程的尾部。讓B線程加入A線程,意味著在A線程運行完成之前,B線程不會進入可運行狀態(tài)。
        Thread t = new Thread();
        t.start();
        t.join;
    這段代碼的意思是取得當前的線程,把它加入到t線程的尾部,等t線程運行完畢之后,原線程繼續(xù)運行。書中的例子在我的電腦里效果很糟糕,看不出什么效果來。也許是CPU太快了,而且是雙核的;也許是JDK1.6的原因?

    12、沒總結(jié)完。線程這部分很重要,內(nèi)容也很多,看太快容易消化不良,偶要慢慢地消化掉……



    附: java原著中對線程的解釋。

    e文原文:

    Thread Scheduling

    In Java technology,threads are usually preemptive,but not necessarily Time-sliced(the process of giving each thread an equal amount of CPU time).It is common mistake to believe that "preemptive" is a fancy word for "does time-slicing".

    For the runtime on a Solaris Operating Environment platform,Java technology does not preempt threads of the same priority.However,the runtime on Microsoft Windows platforms uses time-slicing,so it preempts threads of the same priority and even threads of higher priority.Preemption is not guaranteed;however,most JVM implementations result in behavior that appears to be strictly preemptive.Across JVM implementations,there is no absolute guarantee of preemption or time-slicing.The only guarantees lie in the coder’s use of wait and sleep.

    The model of a preemptive scheduler is that many threads might be runnable,but only one thread is actually running.This thread continues to run until it ceases to be runnable or another thread of higher priority becomes runnable.In the latter case,the lower priority thread is preempted by the thread of higher priority,which gets a chance to run instead.

    A thread might cease to runnable (that is,because blocked) for a variety of reasons.The thread’s code can execute a Thread.sleep() call,deliberately asking the thread to pause for a fixed period of time.The thread might have to wait to access a resource and cannot continue until that resource become available.

    All thread that are runnable are kept in pools according to priority.When a blocked thread becomes runnable,it is placed back into the appropriate runnable pool.Threads from the highest priority nonempty pool are given CPU time.

    The last sentence is worded loosed because:
    (1) In most JVM implementations,priorities seem to work in a preemptive manner,although there is no guarantee that priorities have any meaning at all;
    (2) Microsoft Window’s values affect thread behavior so that it is possible that a Java Priority 4 thread might be running,in spite of the fact that a runnable Java Priority 5 thread is waiting for the CPU.
    In reality,many JVMs implement pool as queues,but this is not guaranteed hehavior.


    熱心網(wǎng)友翻譯的版本:

    在java技術(shù)中,線程通常是搶占式的而不需要時間片分配進程(分配給每個線程相等的cpu時間的進程)。一個經(jīng)常犯的錯誤是認為“搶占”就是“分配時間片”。
    在Solaris平臺上的運行環(huán)境中,相同優(yōu)先級的線程不能相互搶占對方的cpu時間。但是,在使用時間片的windows平臺運行環(huán)境中,可以搶占相同甚至更高優(yōu)先級的線程的cpu時間。搶占并不是絕對的,可是大多數(shù)的JVM的實現(xiàn)結(jié)果在行為上表現(xiàn)出了嚴格的搶占。縱觀JVM的實現(xiàn),并沒有絕對的搶占或是時間片,而是依賴于編碼者對wait和sleep這兩個方法的使用。
    搶占式調(diào)度模型就是許多線程屬于可以運行狀態(tài)(等待狀態(tài)),但實際上只有一個線程在運行。該線程一直運行到它終止進入可運行狀態(tài)(等待狀態(tài))或是另一個具有更高優(yōu)先級的線程變成可運行狀態(tài)。在后一種情況下,底優(yōu)先級的線程被高優(yōu)先級的線程搶占,高優(yōu)先級的線程獲得運行的機會。
    線程可以因為各種各樣的原因終止并進入可運行狀態(tài)(因為堵塞)。例如,線程的代碼可以在適當時候執(zhí)行Thread.sleep()方法,故意讓線程中止;線程可能為了訪問資源而不得不等待直到該資源可用為止。
    所有可運行的線程根據(jù)優(yōu)先級保持在不同的池中。一旦被堵塞的線程進入可運行狀態(tài),它將會被放回適當?shù)目蛇\行池中。非空最高優(yōu)先級的池中的線程將獲得cpu時間。
    最后一個句子是不精確的,因為:
    (1)在大多數(shù)的JVM實現(xiàn)中,雖然不能保證說優(yōu)先級有任何意義,但優(yōu)先級看起來象是用搶占方式工作。
    (2)微軟windows的評價影響線程的行為,以至盡管一個處于可運行狀態(tài)的優(yōu)先級為5的java線程正在等待cpu時間,但是一個優(yōu)先級為4的java線程卻可能正在運行。
    實際上,許多JVM用隊列來實現(xiàn)池,但沒有保證行為。
    posted @ 2008-11-21 18:01 xzc 閱讀(215) | 評論 (0)編輯 收藏

    一般我們在java中運行其它類中的方法時,無論是靜態(tài)調(diào)用,還是動態(tài)調(diào)用,都是在當前的進程中執(zhí)行的,也就是說,只有一個java虛擬機實例在運行。而有的時候,我們需要通過java代碼啟動多個java子進程。這樣做雖然占用了一些系統(tǒng)資源,但會使程序更加穩(wěn)定,因為新啟動的程序是在不同的虛擬機進程中運行的,如果有一個進程發(fā)生異常,并不影響其它的子進程。

    在Java中我們可以使用兩種方法來實現(xiàn)這種要求。最簡單的方法就是通過Runtime中的exec方法執(zhí)行java classname。如果執(zhí)行成功,這個方法返回一個Process對象,如果執(zhí)行失敗,將拋出一個IOException錯誤。下面讓我們來看一個簡單的例子。

                

    // Test1.java文件
    import java.io.*;
    public class Test
    {
     public static void main(String[] args)
     {
    FileOutputStream fOut = new FileOutputStream("c:\\Test1.txt");
    fOut.close();
    System.out.println("被調(diào)用成功!");
     }
    }

    // Test_Exec.java
    public class Test_Exec
    {
     public static void main(String[] args)
     {
    Runtime run = Runtime.getRuntime();
    Process p = run.exec("java test1");
     }
    }

    通過java Test_Exec運行程序后,發(fā)現(xiàn)在C盤多了個Test1.txt文件,但在控制臺中并未出現(xiàn)“被調(diào)用成功!”的輸出信息。因此可以斷定,Test已經(jīng)被執(zhí)行成功,但因為某種原因,Test的輸出信息未在Test_Exec的控制臺中輸出。這個原因也很簡單,因為使用exec建立的是Test_Exec的子進程,這個子進程并沒有自己的控制臺,因此,它并不會輸出任何信息。

    如果要輸出子進程的輸出信息,可以通過Process中的getInputStream得到子進程的輸出流(在子進程中輸出,在父進程中就是輸入),然后將子進程中的輸出流從父進程的控制臺輸出。具體的實現(xiàn)代碼如下如示:

                

    // Test_Exec_Out.java
    import java.io.*;
    public class Test_Exec_Out
    {
     public static void main(String[] args)
     {
    Runtime run = Runtime.getRuntime();
    Process p = run.exec("java test1");
    BufferedInputStream in = new BufferedInputStream(p.getInputStream());
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String s;
    while ((s = br.readLine()) != null)
     System.out.println(s);
     }
    }

    從上面的代碼可以看出,在Test_Exec_Out.java中通過按行讀取子進程的輸出信息,然后在Test_Exec_Out中按每行進行輸出。上面討論的是如何得到子進程的輸出信息。那么,除了輸出信息,還有輸入信息。既然子進程沒有自己的控制臺,那么輸入信息也得由父進程提供。我們可以通過Process的getOutputStream方法來為子進程提供輸入信息(即由父進程向子進程輸入信息,而不是由控制臺輸入信息)。我們可以看看如下的代碼:

                

    // Test2.java文件
    import java.io.*;
    public class Test
    {
     public static void main(String[] args)
     {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("由父進程輸入的信息:" + br.readLine());
     }
    }

    // Test_Exec_In.java
    import java.io.*;
    public class Test_Exec_In
    {
     public static void main(String[] args)
     {
    Runtime run = Runtime.getRuntime();
    Process p = run.exec("java test2");
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
    bw.write("向子進程輸出信息");
    bw.flush();
    bw.close(); // 必須得關閉流,否則無法向子進程中輸入信息
    // System.in.read();
     }
    }

    從以上代碼可以看出,Test1得到由Test_Exec_In發(fā)過來的信息,并將其輸出。當你不加bw.flash()和bw.close()時,信息將無法到達子進程,也就是說子進程進入阻塞狀態(tài),但由于父進程已經(jīng)退出了,因此,子進程也跟著退出了。如果要證明這一點,可以在最后加上System.in.read(),然后通過任務管理器(在windows下)查看java進程,你會發(fā)現(xiàn)如果加上bw.flush()和bw.close(),只有一個java進程存在,如果去掉它們,就有兩個java進程存在。這是因為,如果將信息傳給Test2,在得到信息后,Test2就退出了。

    在這里有一點需要說明一下,exec的執(zhí)行是異步的,并不會因為執(zhí)行的某個程序阻塞而停止執(zhí)行下面的代碼。因此,可以在運行test2后,仍可以執(zhí)行下面的代碼。

    exec方法經(jīng)過了多次的重載。上面使用的只是它的一種重載。它還可以將命令和參數(shù)分開,如exec(“java.test2”)可以寫成exec(“java”, “test2”)。exec還可以通過指定的環(huán)境變量運行不同配置的java虛擬機。

    除了使用Runtime的exec方法建立子進程外,還可以通過ProcessBuilder建立子進程。ProcessBuilder的使用方法如下:

                

    // Test_Exec_Out.java
    import java.io.*;
    public class Test_Exec_Out
    {
     public static void main(String[] args)
     {
    ProcessBuilder pb = new ProcessBuilder("java", "test1");
    Process p = pb.start();
    … …
     }
    }

    在建立子進程上,ProcessBuilder和Runtime類似,不同的ProcessBuilder使用start()方法啟動子進程,而Runtime使用exec方法啟動子進程。得到Process后,它們的操作就完全一樣的。

    ProcessBuilder和Runtime一樣,也可設置可執(zhí)行文件的環(huán)境信息、工作目錄等。下面的例子描述了如何使用ProcessBuilder設置這些信息。

                

    ProcessBuilder pb = new ProcessBuilder("Command", "arg2", "arg2", ''');
    // 設置環(huán)境變量
    Map<String, String> env = pb.environment();
    env.put("key1", "value1");
    env.remove("key2");
    env.put("key2", env.get("key1") + "_test");
    pb.directory("..\abcd"); // 設置工作目錄
    Process p = pb.start(); // 建立子進程

    posted @ 2008-11-17 19:56 xzc 閱讀(698) | 評論 (3)編輯 收藏
    關鍵字: 相對路徑 絕對路徑
    1.基本概念的理解

    絕對路徑:絕對路徑就是你的主頁上的文件或目錄在硬盤上真正的路徑,(URL和物理路徑)例如:
    C:xyz est.txt 代表了test.txt文件的絕對路徑。http://www.sun.com/index.htm也代表了一個URL絕對路徑。

    相對路徑:相對與某個基準目錄的路徑。包含Web的相對路徑(HTML中的相對目錄),例如:在
    Servlet中,"/"代表Web應用的跟目錄。和物理路徑的相對表示。例如:"./" 代表當前目錄,"../"代表上級目錄。這種類似的表示,也是屬于相對路徑。
    另外關于URI,URL,URN等內(nèi)容,請參考RFC相關文檔標準。

    RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,
    (http://www.ietf.org/rfc/rfc2396.txt)


    2.關于JSP/Servlet中的相對路徑和絕對路徑。

    2.1服務器端的地址

    服務器端的相對地址指的是相對于你的web應用的地址,這個地址是在服務器端解析的(不同于html和javascript中的相對地址,他們是由客戶端瀏覽器解析的)也就是說這時候在jsp和servlet中的相對地址應該是相對于你的web應用,即相對于http: //192.168.0.1/webapp/的。

    其用到的地方有:
    forward:servlet中的request.getRequestDispatcher(address);這個address是在服務器端解析的,所以,你要forward到a.jsp應該這么寫:request.getRequestDispatcher(“/user/a.jsp”)這個/ 相對于當前的web應用webapp,其絕對地址就是:http://192.168.0.1/webapp/user/a.jsp。 sendRedirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>

    2.22、客戶端的地址

    所有的html頁面中的相對地址都是相對于服務器根目錄(http://192.168.0.1/)的,而不是(跟目錄下的該Web應用的目錄) http://192.168.0.1/webapp/的。 Html中的form表單的action屬性的地址應該是相對于服務器根目錄(http://192.168.0.1/)的,所以,如果提交到a.jsp 為:action="/webapp/user/a.jsp"或action="<%=request.getContextPath()% >"/user/a.jsp;
    提交到servlet為actiom="/webapp/handleservlet" Javascript也是在客戶端解析的,所以其相對路徑和form表單一樣。


    因此,一般情況下,在JSP/HTML頁面等引用的CSS,Javascript.Action等屬性前面最好都加上
    <%=request.getContextPath()%>,以確保所引用的文件都屬于Web應用中的目錄。另外,應該盡量避免使用類似".","./","../../"等類似的相對該文件位置的相對路徑,這樣當文件移動時,很容易出問題。


    3. JSP/Servlet中獲得當前應用的相對路徑和絕對路徑

    3.1 JSP中獲得當前應用的相對路徑和絕對路徑
    根目錄所對應的絕對路徑:request.getRequestURI()
    文件的絕對路徑  :application.getRealPath(request.getRequestURI());
    當前web應用的絕對路徑 :application.getRealPath("/");
    取得請求文件的上層目錄:new File(application.getRealPath(request.getRequestURI())).getParent()

    3.2 Servlet中獲得當前應用的相對路徑和絕對路徑
    根目錄所對應的絕對路徑:request.getServletPath();
    文件的絕對路徑 :request.getSession().getServletContext().getRealPath
    (request.getRequestURI())
    當前web應用的絕對路徑 :servletConfig.getServletContext().getRealPath("/");
    (ServletContext對象獲得幾種方式:
    javax.servlet.http.HttpSession.getServletContext()
    javax.servlet.jsp.PageContext.getServletContext()
    javax.servlet.ServletConfig.getServletContext()
    )

    4.java 的Class中獲得相對路徑,絕對路徑的方法

    4.1單獨的Java類中獲得絕對路徑
    根據(jù)java.io.File的Doc文擋,可知:
    默認情況下new File("/")代表的目錄為:System.getProperty("user.dir")。
    一下程序獲得執(zhí)行類的當前路徑

     
    1. package org.cheng.file;  
    2.   
    3. import java.io.File;  
    4.   
    5. public class FileTest {  
    6.     public static void main(String[] args) throws Exception {  
    7.         System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));  
    8.   
    9.         System.out.println(FileTest.class.getClassLoader().getResource(""));  
    10.   
    11.         System.out.println(ClassLoader.getSystemResource(""));  
    12.         System.out.println(FileTest.class.getResource(""));  
    13.         System.out.println(FileTest.class.getResource("/"));
    14.         //Class文件所在路徑
    15.         System.out.println(new File("/").getAbsolutePath());  
    16.         System.out.println(System.getProperty("user.dir"));  
    17.     }  


    4.2服務器中的Java類獲得當前路徑(來自網(wǎng)絡)

    (1).Weblogic

    WebApplication的系統(tǒng)文件根目錄是你的weblogic安裝所在根目錄。
    例如:如果你的weblogic安裝在c:eaweblogic700.....
    那么,你的文件根路徑就是c:.
    所以,有兩種方式能夠讓你訪問你的服務器端的文件:
    a.使用絕對路徑:
    比如將你的參數(shù)文件放在c:yourconfigyourconf.properties,
    直接使用 new FileInputStream("yourconfig/yourconf.properties");
    b.使用相對路徑:
    相對路徑的根目錄就是你的webapplication的根路徑,即WEB-INF的上一級目錄,將你的參數(shù)文件放

    在yourwebappyourconfigyourconf.properties,
    這樣使用:
    new FileInputStream("./yourconfig/yourconf.properties");
    這兩種方式均可,自己選擇。

    (2).Tomcat

    在類中輸出System.getProperty("user.dir");顯示的是%Tomcat_Home%/bin

    (3).Resin

    不是你的JSP放的相對路徑,是JSP引擎執(zhí)行這個JSP編譯成SERVLET
    的路徑為根.比如用新建文件法測試File f = new File("a.htm");
    這個a.htm在resin的安裝目錄下

    (4).如何讀相對路徑哪?

    在Java文件中g(shù)etResource或getResourceAsStream均可

    例:getClass().getResourceAsStream(filePath);//filePath可以是"/filename",這里的/代表web

    發(fā)布根路徑下WEB-INF/classes

    默認使用該方法的路徑是:WEB-INF/classes。已經(jīng)在Tomcat中測試。

    5.讀取文件時的相對路徑,避免硬編碼和絕對路徑的使用。(來自網(wǎng)絡)
    5.1 采用Spring的DI機制獲得文件,避免硬編碼。
    參考下面的連接內(nèi)容:
    http://www.javajia.net/viewtopic.php?p=90213&
    5.2 配置文件的讀取
    參考下面的連接內(nèi)容:
    http://dev.csdn.net/develop/article/39/39681.shtm

    5.3 通過虛擬路徑或相對路徑讀取一個xml文件,避免硬編碼

    參考下面的連接內(nèi)容:
    http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8

    6.Java中文件的常用操作(復制,移動,刪除,創(chuàng)建等)(來自網(wǎng)絡)
    常用 java File 操作類
    http://www.easydone.cn/014/200604022353065155.htm

    Java文件操作大全(JSP中)
    http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html

    java文件操作詳解(Java中文網(wǎng))
    http://www.51cto.com/html/2005/1108/10947.htm

    JAVA 如何創(chuàng)建刪除修改復制目錄及文件
    http://www.gamvan.com/developer/java/2005/2/264.html

    總結(jié):
    通過上面內(nèi)容的使用,可以解決在Web應用服務器端,移動文件,查找文件,復制
    刪除文件等操作,同時對服務器的相對地址,絕對地址概念更加清晰。
    建議參考URI,的RFC標準文擋。同時對Java.io.File. Java.net.URI.等內(nèi)容了解透徹
    對其他方面的理解可以更加深入和透徹。
    posted @ 2008-11-11 11:54 xzc 閱讀(651) | 評論 (0)編輯 收藏
    <%@ page contentType="text/html;charset=GBK"%>
    <%@ page import="java.io.*" %>
    <%
    // 得到文件名字和路徑
    String filename = request.getParameter("filename");
    String filepath = request.getSession().getServletContext().getgetRealPath("/download/excel/");
    //String filepath = request.getRealPath("/download/excel/");
    //讀到流中
    InputStream inputStream = new FileInputStream(filepath+"/"+filename);
    //設置輸出的格式
    response.reset();
    response.setContentType("bin");
    response.addHeader("Content-Disposition","attachment;filename=\"" + filename + "\"");
    //循環(huán)取出流中的數(shù)據(jù)
    byte[] bytes = new byte[1000];
    int len = inputStream.read(bytes);
    while (len > 0){
     response.getOutputStream().write(bytes,0,len);
     len = inputStream.read(bytes);
    }
    inputStream.close();
    %>
    posted @ 2008-11-03 17:58 xzc 閱讀(395) | 評論 (0)編輯 收藏
         摘要: Dom4j的使用(全而好的文章) 關鍵字: dom4j Dom4j 使用簡介 作者:冰云 icecloud(AT)sina.com 時間:2003.12.15   版權(quán)聲明: 本文由冰云完成,首發(fā)于CSDN,未經(jīng)許可,不得使用于任何...  閱讀全文
    posted @ 2008-10-31 11:33 xzc 閱讀(456) | 評論 (0)編輯 收藏

        最近不少Web技術(shù)圈內(nèi)的朋友在討論協(xié)議方面的事情,有的說web開發(fā)者應該熟悉web相關的協(xié)議,有的則說不用很了解。個人認為這要分層次來看待這個問題,對于一個新手或者剛?cè)腴T的web開發(fā)人員而言,研究協(xié)議方面的東西可能會使得web開發(fā)失去趣味性、抹煞學習積極性,這類人應該更多的了解基本的Web技術(shù)使用。而對于在該行業(yè)工作多年的老鳥來說,協(xié)議相關的內(nèi)容、標準相關內(nèi)容應該盡量多些的了解,因為只有這樣才能使得經(jīng)手的web系統(tǒng)更加優(yōu)秀(安全、漂亮、快速、兼容性好、體驗好……)。本文我們來說一下MIME 協(xié)議的一個擴展Content-disposition

        我們在開發(fā)web系統(tǒng)時有時會有以下需求:

    • 希望某類或者某已知MIME 類型的文件(比如:*.gif;*.txt;*.htm)能夠在訪問時彈出“文件下載”對話框
    • 希望以原始文件名(上傳時的文件名,例如:山東省政府1024號文件.doc)提供下載,但服務器上保存的地址卻是其他文件名(如:12519810948091234_asdf.doc)
    • 希望某文件直接在瀏覽器上顯示而不是彈出文件下載對話框
    • ……………………

        要解決上述需求就可以使用Content-disposition來解決。第一個需求的解決辦法是

    Response.AddHeader "content-disposition","attachment; filename=fname.ext"
     
    將上述需求進行歸我給出如下例子代碼:
    public static void ToDownload(string serverfilpath,string filename)
    {
    FileStream fileStream = new FileStream(serverfilpath, FileMode.Open);
    long fileSize = fileStream.Length;
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + UTF_FileName(filename) + "\";");
    ////attachment --- 作為附件下載
    ////inline --- 在線打開
    HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
    byte[] fileBuffer = new byte[fileSize];
    fileStream.Read(fileBuffer, 0, (int)fileSize);
    HttpContext.Current.Response.BinaryWrite(fileBuffer);
    fileStream.Close();
    HttpContext.Current.Response.End();
    }
    public static void ToOpen(string serverfilpath, string filename)
    {
    FileStream fileStream = new FileStream(serverfilpath, FileMode.Open);
    long fileSize = fileStream.Length;
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.AddHeader("Content-Disposition", "inline; filename=\"" + UTF_FileName(filename) + "\";");
    HttpContext.Current.Response.AddHeader("Content-Length", fileSize.ToString());
    byte[] fileBuffer = new byte[fileSize];
    fileStream.Read(fileBuffer, 0, (int)fileSize);
    HttpContext.Current.Response.BinaryWrite(fileBuffer);
    fileStream.Close();
    HttpContext.Current.Response.End();
    }
    private static string UTF_FileName(string filename)
    {
    return HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8);
    }

     

    簡單的對上述代碼做一下解析,ToDownload方法為將一個服務器上的文件(serverfilpath為服務器上的物理地址),以某文件名(filename)在瀏覽器上彈出“文件下載”對話框,而ToOpen是將服務器上的某文件以某文件名在瀏覽器中顯示/打開的。注意其中我使用了UTF_FileName方法,該方法很簡單,主要為了解決包含非英文/數(shù)字名稱的問題,比如說文件名為“衣明志.doc”,使用該方法客戶端就不會出現(xiàn)亂碼了。

     需要注意以下幾個問題:

    1. Content-disposition是MIME協(xié)議的擴展,由于多方面的安全性考慮沒有被標準化,所以可能某些瀏覽器不支持,比如說IE4.01
    2. 我們可以使用程序來使用它,也可以在web服務器(比如IIS)上使用它,只需要在http header上做相應的設置即可

    可參看以下幾篇文檔:

    posted @ 2008-10-30 16:07 xzc 閱讀(375) | 評論 (0)編輯 收藏
         摘要:   /** * 取得字符串的字節(jié)長度 */ 代碼 function strlen(str)    {        var i;        var&...  閱讀全文
    posted @ 2008-09-03 15:01 xzc 閱讀(356) | 評論 (1)編輯 收藏

     

    在程序中,文本文件經(jīng)常用來存儲標準的ASCII碼文本,比如英文、加減乘除等號這些運算符號。文本文件也可能用于存儲一些其他非ASCII字符,如基于GBK的簡體中文,基于GIG5的繁體中文等等。在存儲這些字符時需要正確指定文件的編碼格式;而在讀取這些文本文件時,有時候就需要自動判定文件的編碼格式。

    按照給定的字符集存儲文本文件時,在文件的最開頭的三個字節(jié)中就有可能存儲著編碼信息,所以,基本的原理就是只要讀出文件前三個字節(jié),判定這些字節(jié)的值,就可以得知其編碼的格式。其實,如果項目運行的平臺就是中文操作系統(tǒng),如果這些文本文件在項目內(nèi)產(chǎn)生,即開發(fā)人員可以控制文本的編碼格式,只要判定兩種常見的編碼就可以了:GBK和UTF-8。由于中文Windows默認的編碼是GBK,所以一般只要判定UTF-8編碼格式。

    對于UTF-8編碼格式的文本文件,其前3個字節(jié)的值就是-17、-69、-65,所以,判定是否是UTF-8編碼格式的代碼片段如下:
    Java代碼 復制代碼
    1. java.io.File f=new java.io.File("待判定的文本文件名");   
    2. try{   
    3.   java.io.InputStream ios=new java.io.FileInputStream(f);   
    4.   byte[] b=new byte[3];   
    5.   ios.read(b);   
    6.   ios.close();   
    7.   if(b[0]==-17&&b[1]==-69&&b[2]==-65)   
    8.      System.out.println(f.getName()+"編碼為UTF-8");   
    9.   else System.out.println(f.getName()+"可能是GBK");   
    10. }catch(Exception e){   
    11.    e.printStackTrace();   
    12. }   

    上述代碼只是簡單判定了是否是UTF-8格式編碼的文本文件,如果項目對要判定的文本文件編碼不可控(比如用戶上傳的一些HTML、XML等文本),可以采用一個現(xiàn)成的開源項目:cpdetector,它所在的網(wǎng)址是:http://cpdetector.sourceforge.net/。它的類庫很小,只有500K左右,利用該類庫判定文本文件的代碼如下:
    Java代碼 復制代碼
    1. /*------------------------------------------------------------------------  
    2.   detector是探測器,它把探測任務交給具體的探測實現(xiàn)類的實例完成。  
    3.   cpDetector內(nèi)置了一些常用的探測實現(xiàn)類,這些探測實現(xiàn)類的實例可以通過add方法  
    4.   加進來,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。    
    5.   detector按照“誰最先返回非空的探測結(jié)果,就以該結(jié)果為準”的原則返回探測到的  
    6.   字符集編碼。  
    7. --------------------------------------------------------------------------*/  
    8. cpdetector.io.CodepageDetectorProxy detector =   
    9. cpdetector.io.CodepageDetectorProxy.getInstance();   
    10. /*-------------------------------------------------------------------------  
    11.   ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于  
    12.   指示是否顯示探測過程的詳細信息,為false不顯示。  
    13. ---------------------------------------------------------------------------*/  
    14. detector.add(new cpdetector.io.ParsingDetector(false));    
    15. /*--------------------------------------------------------------------------  
    16.   JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼  
    17.   測定。所以,一般有了這個探測器就可滿足大多數(shù)項目的要求,如果你還不放心,可以  
    18.   再多加幾個探測器,比如下面的ASCIIDetector、UnicodeDetector等。  
    19.  ---------------------------------------------------------------------------*/    
    20. detector.add(cpdetector.io.JChardetFacade.getInstance());   
    21. //ASCIIDetector用于ASCII編碼測定   
    22. detector.add(cpdetector.io.ASCIIDetector.getInstance());   
    23. //UnicodeDetector用于Unicode家族編碼的測定   
    24. detector.add(cpdetector.io.UnicodeDetector.getInstance());   
    25. java.nio.charset.Charset charset = null;   
    26. File f=new File("待測的文本文件名");   
    27. try {   
    28.       charset = detector.detectCodepage(f.toURL());   
    29. catch (Exception ex) {ex.printStackTrace();}   
    30. if(charset!=null){   
    31.      System.out.println(f.getName()+"編碼是:"+charset.name());   
    32. }else  
    33.     System.out.println(f.getName()+"未知");  

    上面代碼中的detector不僅可以用于探測文件的編碼,也可以探測任意輸入的文本流的編碼,方法是調(diào)用其重載形式:
    Java代碼 復制代碼
    1. charset=detector.detectCodepage(待測的文本輸入流,測量該流所需的讀入字節(jié)數(shù));  

    上面的字節(jié)數(shù)由程序員指定,字節(jié)數(shù)越多,判定越準確,當然時間也花得越長。要注意,字節(jié)數(shù)的指定不能超過文本流的最大長度。

    判定文件編碼的具體應用舉例:
    屬性文件(.properties)是Java程序中的常用文本存儲方式,象STRUTS框架就是利用屬性文件存儲程序中的字符串資源。它的內(nèi)容如下所示:
    Java代碼 復制代碼
    1. #注釋語句   
    2. 屬性名=屬性值   

    讀入屬性文件的一般方法是:
    Java代碼 復制代碼
    1. FileInputStream ios=new FileInputStream("屬性文件名");   
    2. Properties prop=new Properties();   
    3. prop.load(ios);   
    4. ios.close();   

    利用java.io.Properties的load方法讀入屬性文件雖然方便,但如果屬性文件中有中文,在讀入之后就會發(fā)現(xiàn)出現(xiàn)亂碼現(xiàn)象。發(fā)生這個原因是load方法使用字節(jié)流讀入文本,在讀入后需要將字節(jié)流編碼成為字符串,而它使用的編碼是“iso-8859-1”,這個字符集是ASCII碼字符集,不支持中文編碼,所以這時需要使用顯式的轉(zhuǎn)碼:
    Java代碼 復制代碼
    1. String value=prop.getProperty("屬性名");   
    2. String encValue=new String(value.getBytes("iso-8859-1"),"屬性文件的實際編碼");   

    在上面的代碼中,屬性文件的實際編碼就可以利用上面的方法獲得。當然,象這種屬性文件是項目內(nèi)部的,我們可以控制屬性文件的編碼格式,比如約定采用Windows內(nèi)定的GBK,就直接利用"gbk"來轉(zhuǎn)碼,如果約定采用UTF-8,也可以是使用"UTF-8"直接轉(zhuǎn)碼。如果想靈活一些,做到自動探測編碼,就可利用上面介紹的方法測定屬性文件的編碼,從而方便開發(fā)人員的工作。
    posted @ 2008-06-16 14:44 xzc 閱讀(861) | 評論 (1)編輯 收藏

    第一章 目錄及文件操作命令

    1.1 ls

    [語法]: ls [-RadCxmlnogrtucpFbqisf1] [目錄或文件......]
    [說明]: ls 命令列出指定目錄下的文件,缺省目錄為當前目錄 ./,缺省輸出順序為縱向按字符順序排列。
    -R 遞歸地列出每個子目錄的內(nèi)容
    -a 列出所有文件,包括第一個字符為“.”的隱藏文件
    -d 若后面參數(shù)是目錄,則只列出目錄名而不列出目錄內(nèi)容,常與-l選項連
    用以顯示目錄狀態(tài)。
    -C 輸出時多列顯示
    -x 橫向按字符順序排列
    -m 輸出按流式格式橫向排列,文件名之間用逗號(,)分隔
    -l 長列表輸出,顯示文件詳細信息,每行一個文件,從左至右依次是:
    文件存取模式 鏈接數(shù) 文件主 文件組 文件字節(jié)數(shù) 上次修改時間
    其中文件存取模式用10個字母表示,從左至右的意義如下:
    第一個字母表示文件種類,可以是以下幾種情況:
    d 為目錄文件
    l 為鏈接
    b 為塊文件
    c 為字符型文件
    p 為命名管道(FIFO)
    - 為普通文件
    后面9個字母分別表示文件主、同組用戶、其他用戶對文件的權(quán)力,用r表示可讀,w 表示可寫,x 表示可執(zhí)行。如果是設備文件,則在文件字節(jié)數(shù)處顯示:主設備 從設備。
    -n 與-l選項相同,只是文件主用數(shù)字(即UID)顯示,文件組用數(shù)字
    (即GID)表示
    -o 與-l選項相同,只是不顯示文件組
    -g 與-l選項相同,只是不顯示文件主
    -r 逆序排列
    -t 按時間順序排列而非按名字
    -u 顯示時間時使用上次訪問時間而非上次修改時間
    -c 顯示時間時使用上次修改i節(jié)點時間而非上次修改時間
    -p 若所列文件是目錄文件,則在其后顯示斜杠(/)
    -F 在目錄文件后加’/’,在可執(zhí)行文件后加’*’
    -b 文件名中若有非打印字符,則用八進制顯示該字符
    -q 文件名中的打印字符用’?’表示
    -i 顯示節(jié)點號
    -s 顯示文件長度時使用塊長度而非字節(jié)長度
    -f 將后面的參數(shù)解釋為目錄并列出其中的每一項
    -1 每行僅列一項
    [例子]:
    ls 列出當前目錄下的文件
    ls -al /bin 以長列表的形式列出目錄 /bin 下的所有文件,包括隱藏文件

    1.2 pwd

    [語法]: pwd
    [說明]: 本命令用于顯示當前的工作目錄
    [例子]:
    pwd 顯示出當前的工作目錄

    1.3 cd

    [語法]: cd [目錄]
    [說明]:本命令用于改變當前的工作目錄,無參數(shù)時使用環(huán)境變量$HOME 作為其參數(shù),$HOME 一般為注冊時進入的路徑。
    [例子]:
    cd 回到注冊進入時的目錄
    cd /tmp 進入 /tmp 目錄
    cd ../ 進入上級目錄
    1.4 mkdir

    [語法]: mkdir [-m 模式] [-p] 目錄名
    [說明]: 本命令用于建立目錄,目錄的存取模式由掩碼(umask)決定,要求對其父目錄具有寫權(quán)限,目錄的UID和GID為實際UID和GID
    -m 按指定存取模式建立目錄
    -p 建立目錄時建立其所有不存在的父目錄
    [例子]:
    mkdir tmp 在當前目錄下建立子目錄 tmp
    mkdir -m 777 /tmp/abc 用所有用戶可讀可寫可執(zhí)行的存取模式
    建立目錄 /tmp/aaa ,存取模式參看命令 chmod
    mkdir -p /tmp/a/b/c 建立目錄 /tmp/a/b/c ,若不存在目錄 /tmp/a
    及/tmp/a/b 則建立之

    1.5 rmdir

    [語法]: rmdir [-p] [-s] 目錄名
    [說明]: 本命令用于刪除目錄
    -p 刪除所有已經(jīng)為空的父目錄
    -s 當使用-p 選項時,出現(xiàn)錯誤不提示
    [例子]:
    rmdir /tmp/abc 刪除目錄 /tmp/abc
    rmdir -p /tmp/a/b/c 刪除目錄 /tmp/a/b/c ,若目錄 /tmp/a /b
    及/tmp/a 空,則刪除

    1.6 cat

    [語法]: cat [-u] [-s] [-v[-t] [-e]] 文件...
    [說明]: 顯示和連接一個或多個文件至標準輸出
    -u 無緩沖的輸出(缺省為有緩沖輸出)
    -s 對不存在的文件不作提示
    -v 顯示出文件中的非打印字符,控制字符顯示成^n ,n為八進制數(shù)字,
    其他非打印字符顯示成M-x , x 為該字符低7位的8進制數(shù)值
    -t 在使用-v 選項時,將制表符(tab) 顯示成 ^I,將換頁符
    (formfeed)顯示成 ^ L
    -e 在使用-v 選項時,在每一行的行尾顯示 $
    [例子]:
    cat file 顯示文件
    cat -s -v -e file1 file2 file3 逐個顯示文件 file1 file2 file3

    1.7 head

    [語法]: head [-n] [文件 ...]
    [說明]: 將文件的頭n 行顯示輸出,缺省值為 10 行,顯示多個文件時,在每個文件的前面加上 ==> 文件名 <==
    [例子]:
    head -9999 file1 file2 顯示文件 file1 和 file2 的頭 9999 行

    1.8 more

    [語法]: more [-cdflrsuw] [- 行數(shù)] [+ 行數(shù)] [+ / 模式 ] [ 文件 ... ]
    [說明]: 將文件顯示在終端上,每次一屏,在左下部顯示 --more--,若是從文件讀出而非從管道,則在后面顯示百分比,表示已顯示的部分,按回車鍵則上滾一行,按空格鍵則上滾一屏,未顯示完時可以使用more 命令中的子命令。
    -c 顯示文件之前先清屏
    -d 當輸錯命令時顯示錯誤信息而不是響鈴(bell)
    -f 不折疊顯示長的行
    -l 不將分頁控制符(CTRL D)當作頁結(jié)束
    -r 一般情況下,more 不顯示控制符,本選項使more 顯示控制符,
    例如,將 (CTRL C) 顯示成 ^ C
    -s 將多個空行轉(zhuǎn)換成一個空行顯示
    -u 禁止產(chǎn)生下劃線序列
    -w 一般情況下 more 顯示完后立即推出,本選項在顯示完后作提
    示,敲任意鍵后推出
    -n 行數(shù) 指定每屏顯示的行數(shù)
    + 行號 從指定行號開始顯示
    +/模式 在文件中搜索指定模式,從模式出現(xiàn)行的上兩行開始顯示 文件未顯示完時,可以使用more 命令中的子命令,命令中除了! 和 / 以外均不回顯,也不用敲回車,當命令破壞 more 提示行時,可用退格鍵恢復提示行。在以下子命令操作中,i 表示數(shù)字,缺省值為 1。
    i 空格 上滾一屏多 i 行
    i 回車 上滾 i 行
    i CTRL+D i 缺省時上滾 11 行,否則上滾 i 行
    id i 缺省時上滾 11 行,否則上滾 i 行
    iz i 缺省時上滾一屏,否則定義每屏為 i 行
    is 跳過 i 行后顯示一屏
    if 跳過 i 屏后顯示一屏
    i CTRL+B 跳回 i 屏后顯示一屏
    b 跳回 一屏后顯示一屏
    q 或 Q 推出 more
    = 顯示當前行號
    v 從當前行開始編輯當前文件編輯器由環(huán)境變量
    $EDITOR定義
    h 顯示幫助信息
    i / 模式 向前搜索,直至模式的第 i 次出現(xiàn) , 從該行的上 兩行開始顯示一屏
    in 向前搜索,直至上一模式的第 i 次出現(xiàn) , 從該行 的上兩行開始顯示一屏
    單引號 回到上次搜索的出發(fā)點,若無搜索則回到開始位置
    ! 命令 激活一個sh 去執(zhí)行指定的命令
    i : n 跳到后面第 i 個文件,若不存在則跳到最后一個文件
    :f 顯示當前文件名和行號
    :q 或 :Q 推出 more
    . (點) 重復上次命令
    [ 例子]:
    more -c +50 file 清屏后,從第50行開始顯示文件 file
    more -s -w file1 file2 file3 顯示文件 file1 file2 file3

    1.9 cp

    [語法]: cp [ -p ] [ -r ] 文件 1 [ 文件 2 ...] 目標
    [說明]: 將文件1(文件2 ...)拷貝到目標上,目標不能與文件同名, 若目標是文件名,則拷貝的文件只能有一個,若目標是目錄, 則拷貝的文件可以有多個,若目標文件不存在,則建立這個文件,若存在,則覆蓋其以前的內(nèi)容,若目標是目錄,則將文件拷貝到這個目錄下。
    - i 在覆蓋已存在文件時作提示,若回答 y 則覆蓋,其他則中止
    - p 不僅拷貝文件內(nèi)容,還有修改時間,存取模式,存取控制表, 但不拷貝
    UID 及 GID
    - r 若文件名為目錄,則拷貝目錄下所有文件及子目錄和它們的文件,此時
    目標必須為目錄
    [例子]:
    cp file1 file2 將文件 file1 拷貝到文件 file2
    cp file1 file2 /tmp 將文件 file1 和文件 file2 拷貝到目錄 /tmp 下
    cp -r /tmp /mytmp 將目錄 /tmp 下所有文件及其子目錄拷貝至目錄/mytmp

    1.10 mv

    [語法]: mv [-f] [-i] 文件1 [文件2...] 目標
    [說明]: 將文件移動至目標,若目標是文件名,則相當于文件改名
    - i 在覆蓋已存在文件時作提示,若回答 y 則覆蓋,其他則中止
    - f 覆蓋前不作任何提示
    [例子]:
    mv file1 file2 將文件 file1 改名為 file2
    mv file1 file2 /tmp 將文件 file1 和文件 file2 移動到目錄 /tmp 下

    1.11 rm

    [語法]: rm [-f] [-i] 文件...
    或 rm -r [-f] [-i] 目錄名... [文件]
    [說明]: 用來刪除文件或目錄
    - f 刪除文件時不作提示
    - r 遞歸地刪除目錄及其所有子目錄
    - i 刪除文件之前先作提示
    [例子]:
    rm file1 刪除文件 file1
    rm -i /tmp/* 刪除目錄 /tmp 下的所有文件
    rm -r /mytmp 遞歸地刪除目錄 /mytmp

    1.12 chmod

    [語法]: chmod [-R] 模式 文件...
    或 chmod [ugoa] {+|-|=} [rwxst] 文件...
    [說明]: 改變文件的存取模式,存取模式可表示為數(shù)字或符號串,例如:
    chmod nnnn file , n為0-7的數(shù)字,意義如下:
    4000 運行時可改變UID
    2000 運行時可改變GID
    1000 置粘著位
    0400 文件主可讀
    0200 文件主可寫
    0100 文件主可執(zhí)行
    0040 同組用戶可讀
    0020 同組用戶可寫
    0010 同組用戶可執(zhí)行
    0004 其他用戶可讀
    0002 其他用戶可寫
    0001 其他用戶可執(zhí)行
    nnnn 就是上列數(shù)字相加得到的,例如 chmod 0777 file 是指將文件 file 存取權(quán)限置為所有用戶可讀可寫可執(zhí)行。
    -R 遞歸地改變所有子目錄下所有文件的存取模式
    u 文件主
    g 同組用戶
    o 其他用戶
    a 所有用戶
    + 增加后列權(quán)限
    - 取消后列權(quán)限
    = 置成后列權(quán)限
    r 可讀
    w 可寫
    x 可執(zhí)行
    s 運行時可置UID
    t 運行時可置GID
    [例子]:
    chmod 0666 file1 file2 將文件 file1 及 file2 置為所有用戶可讀可寫
    chmod u+x file 對文件 file 增加文件主可執(zhí)行權(quán)限
    chmod o-rwx 對文件file 取消其他用戶的所有權(quán)限

    1.13 chown

    [語法]: chown [-R] 文件主 文件...
    [說明]: 文件的UID表示文件的文件主,文件主可用數(shù)字表示, 也可用一個有效的用戶名表示,此命令改變一個文件的UID,僅當此文件的文件主或超級用戶可使用。
    -R 遞歸地改變所有子目錄下所有文件的存取模式
    [例子]:
    chown mary file 將文件 file 的文件主改為 mary
    chown 150 file 將文件 file 的UID改為150

    1.14 chgrp

    [語法]: chgrp [-R] 文件組 文件...
    [說明]: 文件的GID表示文件的文件組,文件組可用數(shù)字表示, 也可用一個有效的組名表示,此命令改變一個文件的GID,可參看chown。
    -R 遞歸地改變所有子目錄下所有文件的存取模式
    [例子]:
    chgrp group file 將文件 file 的文件組改為 group

    1.15 cmp

    [語法]: cmp [-l] [-s] 文件1 文件2
    [說明]: 比較兩個文件,若文件1 為 - ,則使用標準輸入, 兩個文件相同則無提示,不同則顯示出現(xiàn)第一個不同時的字符數(shù)和行號。
    -l 顯示每個不同處的字節(jié)數(shù)(10進制)和不同的字節(jié)(8進制)
    -s 不作任何提示,只返回碼
    [例子]:
    cmp file1 file2 比較文件 file1 和 file2
    cmp -l file1 file2 比較文件file1 和 file2 的每處不同

    1.16 diff

    [語法]: diff [-be] 文件1 文件2
    [說明]: 本命令比較兩個文本文件,將不同的行列出來
    -b 將一串空格或TAB轉(zhuǎn)換成一個空格或TAB
    -e 生成一個編輯角本,作為ex或ed的輸入可將文件1轉(zhuǎn)換成文件2
    [例子]:
    diff file1 file2
    diff -b file1 file2
    diff -e file1 file2 >edscript

    1.17 wc

    [語法]: wc [-lwc] 文件...
    [說明]: 統(tǒng)計文件的行、字、字符數(shù),若無指定文件,則統(tǒng)計標準輸入
    -l 只統(tǒng)計行數(shù)
    -w 只統(tǒng)計字數(shù)
    -c 只統(tǒng)計字符數(shù)
    [例子]:
    wc -l file1 file2 統(tǒng)計文件file1和file2 的行數(shù)

    1.18 split

    [語法]: split [-n] [ 文件 [名字]]
    [說明]: split 將指定大文件分解為若干個小文件,每個文件長度為n行(n 缺省時為1000),第一個小文件名為指定的名字后跟aa,直至zz,名字缺省值為x,若未指定大文件名,則使用標準輸入
    [例子]:
    split -500 largefile little
    將文件largefile 每500行寫入一個文件,第一個文件名為littleaa

    1.19 touch

    [語法]: touch [-amc] [mmddhhmm[yy]] 文件...
    [說明]: 將指定文件的訪問時間和修改時間改變,若指定文件不存在則創(chuàng)建之,若無指定時間,則使用當前時間,返回值是未成功改變時間的文件個數(shù),包括不存在而又未能創(chuàng)建的文件。
    -a 只改變訪問時間
    -m 只改變修改時間
    -c 若文件不存在,不創(chuàng)建它且不作提示
    mmddhhmm[yy] 兩位表示 月日時分[年]
    [例子]:
    touch file
    更新文件file的時間
    touch 0701000097 HongKong
    將文件HongKong的時間改為97年7月1日0時0分

    1.20 file

    [語法]: file [-f 文件名文件] 文件...
    [說明]: file 對指定文件進行測試,盡量猜測出文件類型并顯示出來
    -f 文件名文件 文件名文件是一個包含了文件名的文本文件, -f 選項測試
    文件名文件中所列出的文件
    [例子]:
    file * 顯示當前目錄下所有文件的類型

    1.21 pack

    [語法]: pack 文件...
    [說明]: pack 將指定文件轉(zhuǎn)儲為壓縮格式,文件名后加 .z , 文件存取模式,訪問時間,修改時間等均不變
    [例子]:
    pack largefile 將largefile 壓縮后轉(zhuǎn)儲為largefile.z

    1.22 pcat 顯示壓縮文件

    [語法]: pcat 文件...
    [說明]: pcat 顯示輸出壓縮文件

    [例子]:
    pcat largefile.z 顯示壓縮前的largefile
    pcat largefile.z > oldfile 顯示壓縮前的laregfile,并將其重定向到
    文件oldfile中

    1.23 unpack

    [語法]: unpack 文件...
    [說明]: 將壓縮后的文件解壓后轉(zhuǎn)儲為壓縮前的格式
    [例子]:
    unpack largefile.z 將壓縮文件largefile.z解壓后轉(zhuǎn)儲為largefile

    1.24 find

    [語法]: find 路徑名... 表達式
    [說明]: find 命令遞歸地遍歷指定路徑下的每個文件和子目錄,看該文件是否能使表達式值為真,以下 n 代表一個十進制整數(shù),+n 代表打印 n , -n 代表小于 n ,下面是合法表達式說明:
    -name 模式 文件名與模式匹配則為真,(\ 為轉(zhuǎn)意符)
    -perm [-]八進制數(shù) 文件存取模式與八進制數(shù)相同則為真若有- 選項,則文件存
    取模式含有八進制數(shù)規(guī)定模式即為真
    -size n[c] 文件塊長度為 n 則真(一塊為512字節(jié)),若
    有c 選項,則文件字節(jié)長度為 n 則真
    -atime n 若文件的最近訪問時間為 n 天前則為真,
    find 命令將改變其訪問的目錄的訪問時間
    -mtime n 若文件的最近修改時間為 n 天前則為真
    -ctime n 若文件狀態(tài)為 n 天前改變則為真
    -exec 命令 { }\; 若命令返回值為0則真,{ }內(nèi)為命令參數(shù),
    此命令必須以 \; 為結(jié)束
    -ok 命令 { }\; 與 exec 相同,只是在命令執(zhí)行前先提示,若
    回答 y 則執(zhí)行命令
    -print 顯示輸出使表達式為真的文件名
    -newer 文件 若文件的訪問時間比newer 指定的文件新則真
    -depth 先下降到搜索目錄的子目錄,然后才至其自身
    -mount 僅查找包含指定目錄的文件系統(tǒng)
    -local 文件在當前文件系統(tǒng)時為真
    -type c 文件類型為 c 則真,c 取值可為 b(塊文件) c (字符文件)
    d(目錄) l (符號鏈接) p (命名管道) f (普通文件)
    \( 表達式 \) 表達式為真則真
    -links n 文件鏈接數(shù)為 n 時為真
    -user 用戶 當文件屬于用戶時為真,用戶可用數(shù)字表示UID
    -nouser 當文件不屬于 /etc/passwd 中的一個用戶時為真
    -group 文件組 當文件屬于文件組時為真,文件組可用數(shù)字表示GID
    -nogroup 當文件不屬于 /etc/group 中的一個組時為真
    -fstype 類型 當文件所屬文件系統(tǒng)類型為指定類型時真
    -inum n 當文件 i 節(jié)點號為 n 時為真
    -prune 當目錄名與模式匹配時,不再搜索其子目錄
    可以用邏輯操作符將簡單表達式連接成復雜表達式
    邏輯操作符有 ! 表示非操作, -o 表示或操作,兩個表達式并列則表示
    與操作
    [例子]:
    find / -name find* -print
    從根目錄開始搜索文件名如 find* 的文件并顯示之
    find ./ -exec sleep{1}\; -print
    每秒顯示一個當前目錄下的文件
    find $HOME \(-name a.out -o -name '*.o' \) -atime +7 -exec rm {} \;
    從$HOME目錄開始搜索,刪除所有文件名為a.out 或 *.o 且訪問時間在7天前的文件

    1.25 grep

    [語法]: grep [選項] 模式 [文件...]
    [說明]: 在指定的文件中搜索模式,并顯示所有包含模式的行,模式是一個正規(guī)表達式,在使用正規(guī)表達式時,最好將其引在單引號(') 中,若指定文件為缺省,則使用標準輸入,正規(guī)表達式可以是:
    . 匹配任意一個字符
    * 匹配0個或多個*前的字符
    ^ 匹配行開頭
    $ 匹配行結(jié)尾
    [] 匹配[ ]中的任意一個字符,[]中可用 - 表示范圍,
    例如[a-z]表示字母a 至z 中的任意一個
    \ 轉(zhuǎn)意字符
    命令中的選項為:
    -b 顯示塊號
    -c 僅顯示各指定文件中包含模式的總行數(shù)
    -i 模式中字母不區(qū)分大小寫
    -h 不將包含模式的文件名顯示在該行上
    -l 僅顯示包含模式的文件名
    -n 顯示模式所在行的行號
    -s 指定文件若不存在或不可讀,不提示錯誤信息
    -v 顯示所有不包含模式的行
    [例子]:
    grep 'good' * 在所有文件中搜索含有字符串 good 的行
    grep '^myline' mytext 在文件mytext中搜索行首出現(xiàn)myline字符串的行

    1.26 vi

    [語法]:vi [-wn] [-R] 文件...
    [說明]: vi 是一個基于行編輯器 ex 上的全屏幕編輯器,可以在vi 中使用 ex,ed的全部命令,vi選項中 -wn 指將編輯窗口大小置為n行,-R 為將編輯的文件置為只讀模式, vi 工作模式分為命令模式和輸入模式,一般情況下在命令模式下,可敲入vi命令,進入輸入模式下時可以編輯要編輯的文本,命令 a A i I o O c C s S R 可進入輸入模式,在輸入模式下按 ESC 鍵可推出輸入模式,回到命令模式,在命令模式中敲入: 命令,則可進入ex方式,在屏幕底部出現(xiàn)提示符 : ,此時可使用任意ex命令,屏幕底行也用來作/ ? ! 命令的提示行,大多數(shù)命令可以在其前面加數(shù)字,表示命令執(zhí)行的重復次數(shù),下面簡單介紹一下vi 的命令集,^ 表示(CTRL)鍵
    ^B 退回前一頁,前面加數(shù)字表示重復次數(shù),每次換頁時
    保留上一頁的兩行
    ^D 在命令模式下,表示下滾屏幕的一半,在輸入模式下,表示回退至
    左邊的自動縮進處
    ^E 顯示屏幕底線之下的一行
    ^F 前進一頁,前面加數(shù)字表示重復次數(shù),每次換頁時
    保留上一頁的兩行
    ^G 顯示當前文件名,當前行號和文件總行數(shù),并用百分號當前行在
    整個文件中的位置
    ^H(退格) 在命令模式下,光標左移一格;在輸入模式下,刪去前面的字符
    ^I(TAB) 在輸入模式下,產(chǎn)生一串空格
    ^J(LF) 光標下移一行
    ^L 刷新屏幕,即將屏幕重新顯示
    ^M(回車) 在命令模式下,光標移動至下行開頭
    在輸入模式下,開辟一新行
    ^N 光標下移一行
    ^P 光標上移一行
    ^Q 在輸入模式下,將其后的非打印字符作為正文插入
    ^R 刷新屏幕
    ^U 屏幕上滾一半,前面加數(shù)字時表示上滾的行數(shù),此數(shù)字對
    以后的^D ^U 命令有效
    ^V 在輸入模式下,將其后的非打印字符作為正文插入
    ^W 在輸入模式下,使光標回退一個字
    ^Y 顯示屏幕底線之上的一行
    ^Z 暫停編輯,退回上層Shell
    ^[(ESC) 退出輸入模式,回到命令模式
    ! 暫時退出編輯,執(zhí)行Shell命令
    (雙引號) 用于標志有名緩沖區(qū),編號緩沖區(qū)1-9用于保存被刪去的正文,字
    母名緩沖區(qū)a-z供用戶存放自定義的正文
    $ 將光標移動到當前行尾,前加數(shù)字則表示前移行數(shù),如2$表示移動
    到下一行行尾
    % 將光標移動到配對的小括號()或大括號{}上去
    ( 退回句子開頭
    ) 前移到句子開頭
    - 退到上一行第一個非空格字符
    . 重復上一次改變緩沖區(qū)內(nèi)容的命令
    / 模式 向前搜索模式,將光標移動到模式出現(xiàn)處,模式是一個正規(guī)
    表達式,(參看 grep)
    : 在屏幕底部提示:,其后可使用ex命令
    ? 功能同 / ,但方向是向前查找
    [[ 光標回退至前一節(jié)分界處
    \ 轉(zhuǎn)意符
    ]] 光標前移至節(jié)分界處
    ^(不是CTRL) 光標移至當前行第一個非空字符上
    ' 連續(xù)兩個''表示將光標移至其移動前的位置,'后跟字母表示光標字
    母標記的行首(參看 m 命令)
    A 在行尾插入正文,進入輸入模式
    B 光標回退一個字
    C 替換光標后的內(nèi)容
    D 刪除光標后的內(nèi)容
    E 光標前移到字尾
    F 字符 在當前行向左查找指定字符
    G 光標移動到其前面數(shù)字指定的行,若未指定則移動到最后一行
    H 光標移動到屏幕頂行,若前面有數(shù)字,則移動到屏幕上該數(shù)字
    指定的行
    I 在行開頭插入正文
    J 連接兩行,若前面有數(shù)字則連接數(shù)字指定的行
    L 光標移動到屏幕底行,若前面有數(shù)字,則移動到屏幕底線往上數(shù)該
    數(shù)字指定的行
    M 光標移動到屏幕中線
    N 使用模式查找/或?時,重復找下一個匹配的模式,但方向與上次相
    反,其功能同 n ,但方向相反
    O 在當前行上開辟一新行
    P 將上次被刪除的正文插入光標前面,可在其前面加緩沖區(qū)編號,編
    號1-9用于保存被刪去的正文,字母名緩沖區(qū)a-z供用戶存放自定
    義的正文
    Q 從vi 推出進入ex命令狀態(tài)
    R 替換字符串
    S 替換整行
    T 字符 向左查找字符
    U 將當前行恢復至第一次修改前的狀態(tài)
    W 光標移至下一個字首
    X 刪除光標前的字符
    Y 將當前行存入無名緩沖區(qū),前面加數(shù)字表示存入的行數(shù),也可用有
    名緩沖區(qū)來保存,以后可用命令p或P將其取出
    ZZ 存盤退出vi
    a 光標后插入正文
    b 光標回退至上一個字首
    cw 替換當前字
    c) 替換當前句子
    dw 刪除一個字
    dd 刪除一行
    e 光標移到下一個字末
    f 字符 在當前行向前查找字符
    h 光標左移一格
    i 在光標前插入正文
    j 光標下移一行
    k 光標上移一行
    l 光標右移一格
    m 字母 用字母標記當前行,以后可用 '字母使光標移動到當前行,
    (參看'命令)
    n 重復上次 / 或 ? 命令
    o 在當前行下開辟一新行
    p 將用戶緩沖區(qū)內(nèi)容放到光標位置(參看P命令)
    r 替換當前字符
    s 用一串字符替換當前字符
    t 字符 光標移動至字符前
    u 取消上次操作
    w 光標移至下一字首
    x 刪除當前字符
    yw 將當前字存入無名緩沖區(qū),前面可加x,表示存入名字為x的有名
    緩沖區(qū)(x為a-z),也可加數(shù)字表示存入的字數(shù),以后可用P或p命
    令取出
    yy 將當前行存入無名緩沖區(qū),用法參看yw
    { 光標移動至前一段開頭
    | 光標移至行首,若前面加數(shù)字,則移到數(shù)字指定行的行首
    } 光標移至下一段開頭
    在:提示符下,常用命令如下:
    :w 當前文件存盤
    :w! 強制存盤
    :w 文件 將內(nèi)容寫入指定文件
    :w! 文件 強制寫入指定文件
    :x,y w 文件 將 x至 y 行寫入指定文件中
    :r 文件 將文件讀到光標位置
    :r ! 命令 將系統(tǒng)命令的輸出讀到光標位置
    :q 退出編輯
    :q! 強制退出
    :x 與命令ZZ相同
    :e 文件名 編輯另一文件
    :e ! 重新編輯文件,放棄任何改變
    :sh 執(zhí)行sh,結(jié)束后回到編輯
    :! 命令 執(zhí)行命令后回到編輯
    :n 編輯下一文件
    :n 文件表 重新定義待編輯文件表
    :set 設置 vi 的選項,例如 set nu 表示每行前顯示行號,在選項前
    加no則表示清除該選項,例如 set nonu 表示每行前不顯示行
    號,下面是一些常用的選項:
    ai 自動縮進
    aw 編輯下一文件前自動存盤
    ic 查找字符串時不區(qū)分大小寫
    nu 每行前顯示行號
    sm 輸入)及}時顯示與之配對的( 或 {
    slow 插入時延遲屏幕刷新
    ws 使查找能繞過文件尾從頭進行
    wa 寫文件之前不作對文件的檢查

    第二章 設備管理

    2.1 stty
    [語法]: stty [-a] [-g] [選項]
    [說明]: 本命令設置終端,無參數(shù)時報告終端設置,本命令功能十分強大,應謹慎使用,下面僅介紹部分常用功能
    -a 顯示當前終端所有設置
    -g 以能作為 stty 命令參數(shù)的方式顯示終端設置
    以下是終端常用設置,在設置前加-表示清除設置:
    1.控制方式
    ispeed 0 110 300 600 1200 1800 2400 4800 9600 19200 38400
    本命令設置終端輸入波特率,若為0則使用缺省波特率。
    例如 stty ispeed 9600
    ospeed 0 110 300 600 1200 1800 2400 4800 9600 19200 38400
    本命令設置終端輸出波特率,參看 ispeed。
    2.輸入方式
    ingbrk(-ignbrk) 忽略(不忽略)中斷(BREAK)
    brkint(-brkint) 設置(清除)信號INTR為中斷信號
    inlcr(-inlcr) 將換行轉(zhuǎn)換(不轉(zhuǎn)換)成回車
    icrnl( -icrnl) 將回車轉(zhuǎn)換(不轉(zhuǎn)換)成換行
    igncr(-ignrc) 忽略(不忽略)回車
    iuclc( -iuclc) 將大寫字母轉(zhuǎn)換(不轉(zhuǎn)換)成小寫字母
    3.輸出方式
    olcut(-olcut) 將小寫字母轉(zhuǎn)換(不轉(zhuǎn)換)為大寫字母
    onlcr(-onlcr) 輸出時將換行符轉(zhuǎn)換(不轉(zhuǎn)換)為回車換行
    ocrnl(-ocrnl) 輸出時將回車符轉(zhuǎn)換(不轉(zhuǎn)換)為換行符
    4.本地方式
    echo (-echo) 設置(清除)回顯
    stwrap(-stwrap) 截斷(不截斷)大于79個字符的行
    echoctl(-echoctr) 將控制鍵回顯為^
    2.2 tty

    [語法]: tty
    [說明]: 顯示出終端的設備名
    [例子]:
    tty

    2.3 lp

    [語法]: lp 文件...
    [說明]: 將文件送打印機打印
    [例子]:
    lp myfile 將文件myfile 送打印機輸出

    2.4 lpstat

    [語法]: lpstat [選項] [打印任務號]
    [說明]: 顯示打印機狀態(tài),選項的意義如下:
    -a [打印機表] 顯示打印機表中指定的打印機可否接收打印請求
    -c [打印機類名] 顯示打印機種類及在該打印機種類下的成員
    -d 顯示系統(tǒng)預設的打印機
    -p [打印機表] 顯示打印機表中打印機狀態(tài)
    -r 顯示lp 請求程序表( lp request scheduler)
    -s 打印系統(tǒng)統(tǒng)計表
    -t 打印所有狀態(tài)信息
    -u [用戶] 顯示由用戶發(fā)出的打印請求
    -v [打印機名表] 顯示每個打印機名稱,是對應于該打印機設備文件的路徑名
    [例子]:
    lpstat -t 打印所有狀態(tài)信息

    2.5 cancel

    [語法]: cancel 打印任務號
    cancel 打印機名
    cancel -u 用戶名 [打印機]
    [說明]: 本命令可按打印機名,打印任務,用戶來取消打印任務
    [例子]:
    cancel -u mary 取消用戶 mary 的所有打印請求

    2.6 enable

    [語法]: enable 打印機表
    [說明]: 本命令可激活一個或多個打印機

    2.7 disable

    [語法]: disable [-cw] 打印機表
    [說明]: 使一個或多個打印機不能打印
    -c 立即取消正在打印的打印請求
    -w 等正在打印的內(nèi)容打完后,才禁止打印機

    2.8 sync

    [語法]: sync
    [說明]: 將磁盤緩沖區(qū)內(nèi)容寫回磁盤
    2.9 mount

    [語法]: mount [-r] 設備 目錄
    [說明]: 將設備安裝到目錄下
    -r 以只讀方式安裝

    2.10 umount

    [語法]: umount 設備
    [說明]: 將已安裝的文件系統(tǒng)卸下

    2.11 tar

    [語法]: tar -c[vwfbL] [設備] [塊] 文件...
    tar -r[vwfbL] [設備] [塊] 文件...
    tar -t[vfL] [設備] [文件...]
    tar -u[vwfbL] [設備] [塊] 文件...
    tar -x[lmovwfL] [設備] [文件...]
    [說明]: 將多個文件歸檔,命令中各參數(shù)的意義為:
    r 附加方式歸檔
    x 抽取文件
    t 顯示文件
    u 附加方式歸檔,同時刪除舊版文件
    c 建立新檔案文件
    v 顯示所處理的文件名
    w 處理文件前,要求用戶確認
    f 文件名 使用指定文件名作為檔案文件
    bn 每次讀寫 n 塊,缺省值為1,最大值為20
    m 將新的文件修改時間設為獲取時的時間
    o 獲取出來的文件以下達tar指令的UID和GID存儲
    [例子]:
    tar cvf file.tar *
    tar tvf file.tar

    2.12 df

    [語法]: df [-t] [文件系統(tǒng)]
    [說明]: 顯示剩余 i 節(jié)點和塊數(shù),使用 -t 選項,還顯示總塊數(shù)和 i 節(jié)點數(shù)
    [例子]: df -t

    2.13 du

    [語法]: du [-ars] [目錄]
    [說明]: 顯示磁盤空間專用情況
    -r 提供無法打開的文件信息
    -s 僅顯示指定目錄所占空間的總和
    -a 顯示文件大小及目錄總空間,其后可根文件名作參數(shù)

    第三章 進程管理

    3.1 sleep

    [語法]: sleep 時間
    [說明]: 掛起參數(shù)指定的秒數(shù)

    3.2 ps

    [語法]: ps [ -efl] [ -t 終端表] [ -u 用戶表] [ -g 組表]
    [說明]: 顯示出有關進程的狀態(tài)
    -e 顯示出現(xiàn)在正在運行的所有進程
    -f 顯示所有信息
    -l 產(chǎn)生一個長列表
    -t 顯示指定終端進程
    -u 顯示指定用戶進程
    -g 顯示指定組進程

    3.3 at

    [語法]: at [-f 命令文件] [-m] [-q 隊列] -t 時間
    [說明]: at命令由cron管理,在未來一個指定的時間內(nèi)執(zhí)行一組命令,命令可以從指定文件讀入,也可從鍵盤讀入,從鍵盤讀入時以EOF結(jié)束,(通常為CTRL D)
    -f 從指定命令文件中讀入命令
    -m 命令執(zhí)行完后給用戶發(fā)郵件
    -q 將命令放入指定隊列
    -t 指定時間 指定的時間格式為 [[CC]YY]MMDDhhmm[.ss],CC表示
    年的前兩位,YY表示年的后兩位,MM表示月,DD表示日,hh表
    示時,mm表示分,ss表示秒

    3.4 kill

    [語法]: kill -信號 進程號
    [說明]: kill 將信號傳遞給指定進程,信號意義如下:
    1 暫停(hangup)
    2 中斷(interrupt)
    3 退出(quit)
    4 非法指令(illeqgal instruction)
    5 跟蹤中斷(trace trap)
    6 Abort
    7 EMT 指令(Emulation trap)
    8 浮點格式異常(floating point exception)
    9 kill(不可忽略)
    10 通道錯誤(bus error)
    11 不合法內(nèi)存段
    12 錯誤的系統(tǒng)調(diào)用參數(shù)
    13 寫入不可讀的連通管道
    14 alarm clock
    15 軟件結(jié)束信號
    16 用戶定義信號一
    17 用戶定義信號二
    [例子]:
    kill -9 444 殺死進程號為 444 的進程

    第四章 系統(tǒng)管理和用戶管理

    4.1 who

    [語法]: who
    who am i
    [說明]: 列出現(xiàn)在系統(tǒng)中的用戶,who am i 顯示自己

    4.2 whodo

    [語法]: whodo [-h] [-l] [用戶]
    [說明]: 顯示系統(tǒng)中用戶及進程,若指定用戶,則只列出該用戶的信息
    -h 不顯示頭部信息
    -l 長列表格式輸出

    4.3 passwd

    [語法]: passwd [用戶]
    [說明]: 修改密碼,指定用戶則修改指定用戶密碼

    4.4 logname

    [語法]: logname
    [說明]: 取得當前用戶注冊名

    4.5 su

    [語法]: su [- ] [用戶名]
    [說明]: su 命令使當前用戶成為指定用戶,若無指定,則成為超級用戶,但必須輸入該用戶的密碼,-選項表示用該用戶的注冊環(huán)境成為該用戶

    4.6 time

    [語法]: time 命令
    [說明]: 執(zhí)行命令,并在執(zhí)行完后顯示其運行的時間

    4.7 date

    [語法]: date
    date mmddhhmm[yy]
    [說明]: date 無參數(shù)時用于顯示系統(tǒng)時間,修改時間時參數(shù)形式為
    月日時分[年]

    4.8 shutdown

    [語法]: shutdown [-y] [-gn] [-in]

    [說明]: UNIX 系統(tǒng)必須先關閉系統(tǒng),再關電源
    -y 對提示的所有問題都回答 y
    -gn 給其他用戶n 秒的時間退出,缺省值為60秒
    -in 系統(tǒng)退到第n種方式,方式如下:
    0 關機
    1 單用戶模式
    2 多用戶模式
    3 網(wǎng)絡下的多用戶模式
    6 關機并重新啟動

    4.9 fsck

    [語法]: fsck [-y]
    [說明]: 本命令用于檢查和修復文件系統(tǒng),當文件系統(tǒng)出現(xiàn)混亂時,可使用本命令,-y選項表示對所有提問都回答YES

    第五章 通信和郵件

    5.1 wall

    [語法]: wall
    [說明]: 向所有用戶廣播通知信息,常用于警告所有用戶

    5.2 mesg

    [語法]: mesg [-n] [-y]
    [說明]: mesg 用 -n 參數(shù)則禁止其他用戶用 write 發(fā)消息,用 -y 參數(shù)則允許接收消息,若無參數(shù)則報告現(xiàn)在的狀況

    5.3 write

    [語法]: write 用戶 終端
    [說明]: write 與指定的終端上的用戶直接對話,直到接收到文件結(jié)束符
    [例子]:
    write mary console

    5.4 mailx

    [語法]: mailx [選項] [名字]
    [說明]: 本命令用于發(fā)送和接收郵件,名字是收信人的用戶名,本命令有許多內(nèi)部命令,選項說明如下:
    -e 檢查是否有郵件,若有則返回0
    -f 文件名 從文件中讀取郵件而非從郵箱中
    -H 只顯示信件標題
    -s 標題 設定標題為指定標題
    [命令說明]
    . 當前信件
    n 第 n 封信
    ^ 第一封未被處理的信
    $ 最后一封信
    * 所有的信
    n-m 第n 封至第m封信
    用戶 由指定用戶發(fā)出的信
    / 字符串 標題中包含字符串的信
    :c 滿足指定類型c的信,類型可為
    d 已刪除的信
    n 信傳送的信
    o 舊信件
    r 已讀過的信
    u 未讀過的信
    p 一次顯示多封信
    t 顯示某封信的前若干行
    si 顯示信件字符數(shù)
    h 顯示信件標題
    d 刪除信件
    u 恢復信件
    s [信件表] 文件名
    將信件存入指定文件中
    q 退出
    r 回信
    ~e 編輯信件
    ~r 文件 從文件中讀取信件
    [例子]:
    mailx mary < myletter

    第六章 Shell 編程

    shell 不但是 Unix 的用戶交互界面,還是一門程序設計語言,系統(tǒng)注冊進入時就會執(zhí)行一個shell命令文件 .profile ,下面對shell中的常用命令作簡單介紹。
    $n shell 程序命令行中的第n 個參數(shù),n為0-9,當n 為0時表示命令名
    $# 命令行中參數(shù)的個數(shù)
    $$ 本shell 命令的進程號
    $! 最后一個后臺進程的代號
    $* 所有命令行參數(shù)
    $@ 與$*相似,但其值不同
    $HOME 注冊時進入的目錄
    $PATH 命令的搜索目錄
    $PS1 系統(tǒng)第一個提示符,一般為$
    $PS2 系統(tǒng)第二個提示符,一般為>
    shift [n] 將命令行參數(shù)往左移一位,但$0不變
    變量名=字符串 將字符串賦予變量名,以后可用$變量名引用該變量
    export 變量名表 將變量名表所列變量傳遞給子進程
    read 變量名表 從標準輸入讀字符串,傳給指定變量
    echo 變量名表 將變量名表指定的變量顯示到標準輸出
    set 顯示設置變量
    env 顯示目前所有變量
    if 條件執(zhí)行,語法是: if 條件
    then 指令
    fi
    case 分支執(zhí)行,語法是: case 字符串變量 in
    值1) 指令...
    值2) 指令...
    ...
    esac
    while 條件為真時循環(huán),語法是:
    while 條件
    do
    指令...
    done
    until 條件為假時循環(huán),語法是:
    until 條件
    do
    指令...
    done
    for 變量在表中時循環(huán),語法是:
    for 變量名 in 字組表
    do
    指令...
    done
    break 從循環(huán)中退出,語法:
    break n
    n 表示跳出循環(huán)的層數(shù)
    continue 繼續(xù)循環(huán),語法:
    continue n
    n 表示退到包含continue 語句的第n 層繼續(xù)循環(huán)
    exit 退出shell
    func shell內(nèi)部可定義函數(shù),語法: func 函數(shù)名()
    {
    指令...
    }
    expr 將其后的串解釋為表達式并計算其值,運算符前后需有空格
    trap 捕獲信號,語法 trap n ,捕獲信號 n (信號說明參見kill)
    test 條件測試,語法 test [選項] 參數(shù)
    選項 -f 文件 若文件存在且可讀則真
    -w 文件 若文件存在且可寫則真
    -x 文件 若文件存在且可執(zhí)行則真
    -f 文件 若文件存在且為普通文件則真
    -d 文件 若文件存在且為目錄文件則真
    -p 文件 若文件存在且為fifo文件則真
    -s 文件 若文件存在且不空則真
    -z 串 若串長度為0則真
    -n 串 若串長度不為0則真
    串 若串不是空串則真
    串1=串2 若串1等于串2則真
    串1!=串2 若串1不等于串2則真
    n1 -eq n2 若n1與n2數(shù)值相當則真
    n1 -ne n2 若n1與n2數(shù)值不相當則真
    n1 -lt n2 若n1小于n2則真
    n1 -le n2 若n1小于等于n2則真
    n1 -gt n2 若n1大于n2則真
    n1 -ge n2 若n1大于等于n2則真
    可用 與 -a 或 -o 非 ! 將條件表達式連接起來

    第七章 數(shù)學計算命令

    [語法]: bc [-c] [-l] [文件...]
    [說明]: bc是一個交互式的高精度計算工具,采用類似于C語言的語法,能夠從指定文件指定文件中讀出命令執(zhí)行,然后再進入交互式執(zhí)行,事實上,bc是dc的預編譯器,它自動激活dc,將語句經(jīng)預編譯后傳遞給dc,退出bc的命令是quit,bc中的ibase,obase,scale分別表示輸入基數(shù),輸出基數(shù),小數(shù)點右邊的位數(shù)。
    -c bc 只編譯,而不將編譯結(jié)果送dc,將其送到標準輸出上
    -l 預定義一個數(shù)學函數(shù)庫,可在bc中使用以下函數(shù)
    s(x) sine
    c(x) cosine
    e(x) exponential
    l(x) log
    a(x) arctangent
    j(n,x) Bessel
    [例子]:
    bc -l 進入bc
    scale=10 將小數(shù)位定為10位
    e(1) 計算e的小數(shù)點后10位
    quit 退出bc

    附錄 UNIX 常用命令簡單說明

    UNIX 命令大多數(shù)可用聯(lián)機幫助手冊 man 獲得幫助,下面是常用命令及簡單說明,可供用戶快速查找使用。

    命令 功能簡述

    acctcom 等于進程記帳文件
    accton 啟動或中止記帳進程
    adb 匯編語言調(diào)試工具
    admin 創(chuàng)建和管理SCCS文件
    ar 檔案文件和庫文件管理程序
    as 匯編器
    asa 回車控制
    at 在指定時間執(zhí)行程序
    awk 模式搜索和處理語言
    banner 制作標題
    basename 生成文件基本名(無前。后綴)
    batch 命令的延遲執(zhí)行
    bc 計算器
    bdiff 大型文件比較
    bfs 大文件搜索
    break 退出循環(huán)
    cal 打印日歷表
    calendar 打印日歷表
    cancel 取消打印任務
    case 分支語句
    cb C語言整理程序
    cd 改變當前目錄
    cc C語言編譯器
    cdc SCCS實用程序
    cflow 生成C語言流程圖
    checkeq 數(shù)學公式排版命令
    chgrp 改變文件組
    chmod 改變文件存取模式
    chown 改變文件主
    chroot 改變根目錄
    cksum 顯示校驗和
    clri 清除指定的I節(jié)點
    cmp 文件比較
    col 過濾反向換行
    comb SCCS實用程序
    comm 顯示兩個排序文件的公共行
    command 執(zhí)行簡單命令
    continue 進入下一循環(huán)
    cp 復制文件
    cpio 復制文件檔案
    cpp C語言預處理程序
    crash 檢查系統(tǒng)內(nèi)存映象
    create 建立臨時文件
    cref 生成交叉引用表
    cron 在指定時間執(zhí)行一組命令
    crontab 為命令cron 準備crontab文件
    crypt 加密/解密
    csplit 將一個文件分解
    ct 遠程終端注冊
    ctags 創(chuàng)建供vi使用的標識符
    cu 呼叫另一UNIX系統(tǒng)
    cut 斷開一文件中所選擇的字段
    cxref 生成C程序交叉訪問表
    date 打印和設置時間
    dc 桌面計算器
    dd 轉(zhuǎn)換和復制文件
    delta SCCS實用程序
    deroff 去掉排版格式
    devnm 標識設備名
    df 顯示可用磁盤空間
    diff 顯示兩個文件的差異
    diff3 顯示三個文件的差異
    dircmp 目錄比較
    dis 反匯編程序
    du 顯示對磁盤的占用情況
    dump 對指定文件備份
    echo 回顯指定參數(shù)
    ed 行編輯器
    edit 文本編輯器
    egrep 在文件中查找指定模式
    env 設置命令執(zhí)行環(huán)境
    eqn 數(shù)學公式排版命令
    eval 執(zhí)行指定命令
    ex 行編輯器
    exec 執(zhí)行指定命令
    exit 進程中止
    expand 使表格占滿行寬
    export 將變量傳遞給子程序
    expr 計算表達式值
    factor 因式分解
    false 返回FALSE
    fgrep 在文件中查找指定模式
    file 確定文件類型
    find 查找符號條件的文件
    fmt 安排簡單的文本格式
    fold 折行
    for 循環(huán)語句
    fsck 文件系統(tǒng)檢查和修復
    fsdb 文件系統(tǒng)調(diào)試程序
    fumount 強制性拆協(xié)指定資源
    function 函數(shù)說明
    fuser 列出使用文件的進程
    fwtmp 產(chǎn)生記帳記錄
    get SCCS實用程序
    getconf 查找配置參數(shù)
    getopt 獲得命令中的選擇項
    getopts 獲得命令中的選擇項
    getty 設置終端類型、模式、行律等
    grep 在文件中查找指定模式
    head 打印文件的頭若干行
    hexdump 按十六進制轉(zhuǎn)儲文件
    id 顯示用戶號
    if 條件語句
    init UNIX 初啟進程
    install 安裝一個文件到文件系統(tǒng)
    ipcrm 刪除IPC隊列
    ipcs 顯示IPC狀態(tài)
    join 連接兩個文件(關系操作〕
    kill 中止指定進程
    killall 中止所有活動進程
    labelit 給文件系統(tǒng)提供標號
    ld 目標文件鏈接編輯器
    lex 詞法分析程序
    line 讀一行
    link 連接文件
    lint C程序檢查程序
    ln 鏈接文件
    local 建立局部變量
    logger 顯示注冊信息
    login 注冊
    logname 獲取注冊名
    look 在排序文件中查找某行
    lorder 查找目標庫的次序關系
    lp 打印文件
    lpr 打印文件
    lpstat 顯示打印隊列狀態(tài)
    ls 目錄列表
    mail 發(fā)送或接收電子郵件
    mailx 發(fā)送、接收或處理電子郵件
    make 執(zhí)行有選擇的編譯
    makekey 生成加密碼
    man 顯示命令用法
    mesg 接收或取消對話方式
    mkdir 建立目錄
    mkfifo 建立FIFO文件
    mkfs 建立文件系統(tǒng)
    mknod 建立文件系統(tǒng)的I節(jié)點
    mount 安裝文件系統(tǒng)
    mv 移動文件
    mvdir 移動目錄
    ncheck 按節(jié)點號生成節(jié)點名清單
    neqn 數(shù)學公式排版命令
    newgrp 把用戶加入到新組
    news 打印消息
    nice 改變命令執(zhí)行優(yōu)先級
    nl 給文件加行號
    nm 顯示目標文件符號表
    nohup 忽略掛起或退出執(zhí)行命令
    nroff 文本文件排版
    od 按八進制轉(zhuǎn)儲文件
    pack 壓縮文件
    passwd 改變口令
    paste 文件合并
    pax 可移植檔案管理程序
    pcat 顯示壓縮格式文件
    pg 分屏顯示
    pr 按打印格式顯示文件
    pstat 報告系統(tǒng)信息
    pwck 口令文件校驗程序
    pwd 顯示當前工作目錄
    quot 檢查文件系統(tǒng)所有權(quán)
    ratfor 轉(zhuǎn)換成標準FORTRANC程序
    read 從標準輸入讀一行
    readonly 標記變量為只讀
    red 文本編輯器
    regcmp 正規(guī)表達式編輯
    restor 文件系統(tǒng)恢復程序
    restore 文件系統(tǒng)恢復程序
    return 返回語句
    rev 顛倒文件中每行字符次序
    rm 刪除文件
    rmdel SCCS使用程序
    rmdir 刪除目錄
    rsh(net) 遠程SHELL
    rsh(sec) 受限SHELL
    runacct 運行日常記帳程序
    sact SCCS實用程序
    sag 打印系統(tǒng)活動圖
    sar 報告系統(tǒng)活動
    sccsdiff SCCS實用程序
    sdb 符號調(diào)試器
    sdiff 并列顯示兩個文件的差別
    sed 流編輯器
    sendto 發(fā)送郵件
    set 設置選項或參數(shù)
    setmnt 建立文件系統(tǒng)安裝表
    sh SHELL解釋器
    shift 命令行參數(shù)移位
    shl SHELL層(layer)管理程序
    shutdown 關機
    size 顯示目標文件長度
    sleep 掛起進程一段時間
    sort 文件排序和合并
    spell 拼寫錯誤檢查程序
    spellin 拼寫錯誤檢查
    spellout 拼寫錯誤檢查
    spline 按平滑曲線輸出數(shù)據(jù)
    split 分解一個文件
    strings 在目標文件中尋找可打印字符
    strip 刪除符號表
    stty 設置終端模式
    su 改變用戶
    sum 顯示文件校驗和及塊數(shù)
    sync 更新磁盤
    tabs 設置制表符
    tbl 表格排版
    tee 在管道上建立多通路
    tic 終端數(shù)據(jù)庫編譯程序
    time 打印執(zhí)行命令所花時間
    tiemx 報告命令所花時間及活動
    touch 更新文件時間
    tput 恢復終端或查詢數(shù)據(jù)庫
    tr 轉(zhuǎn)換字符
    trap 捕獲信號
    troff 文本文件排版
    true 返回TRUE
    tsort 拓撲排序
    tty 顯示終端設備名
    umask 設置文件掩碼
    umount 拆卸文件系統(tǒng)
    uname 顯示系統(tǒng)名
    unget SCCS實用程序
    uniq 刪除文件中重復行
    units 度量單位轉(zhuǎn)換
    unlink 刪除文件
    unpack 將壓縮文件還原
    until 循環(huán)語句
    update 更新磁盤
    val SCCS實用程序
    vc SCCS實用程序
    vi 全屏幕編輯器
    volcopy 文件系統(tǒng)的文字拷貝
    wait 等待所有字進程結(jié)束
    while 循環(huán)語句
    who 顯示誰在使用系統(tǒng)
    whodo 顯示哪些用戶在做什么
    write 和另一用戶直接對話
    xargs 建立參數(shù)表并執(zhí)行命令
    yacc 語法分析程序生成器

    posted @ 2008-06-13 23:16 xzc 閱讀(852) | 評論 (2)編輯 收藏

    Unix命令大全

    1.登錄工作站
    1.1 透過 PC 登錄工作站
    執(zhí)行格式:telnet hostname (在 dos 下執(zhí)行)
    telnet ip-address
    Example:

    telnet doc telnet 140.122.77.120

    注: 可利用指令 arp hostname 或 arp domain_name 查詢 ip_address

    1.2 登錄步驟
    login : _______ > 輸入 username

    password : _______ > 輸入密碼

    1.3 登出步驟

    % logout
    或 % exit
    或 %

    1.4 更改帳號密碼

    % yppasswd > 執(zhí)行后將會出現(xiàn)下列信息
    Changing NIS password for user on ice.
    Old password: ______ > 輸入舊密碼
    New password: ______ > 輸入新密碼(最好6-8字,英文字母與數(shù)字混合)
    Retype new password: ______ > 再輸入一次密碼

    1.5 在線幫助指令說明
    執(zhí)行格式: man command-name

    Example: % man ls

    1.6 進入遠端電腦系統(tǒng)
    執(zhí)行格式:rlogin hostname [-1 username]
    Example:

    %rlogin doc
    remote login 進入工作站 doc 中。
    %rlogin doc -l user
    使用 user 帳號進入工作站 doc 中。

    執(zhí)行格式:telnet hostname 或 telnet IP address
    Example:

    %telnet doc or %telnet 140.109.20.251

    2. 文件或目錄處理
    2.1 列出文件或目錄下之文件名稱
    執(zhí)行格式: ls [-atFlgR] [name] ( name 可為文件名或目錄名稱。)

    Example :

    ls 列出目前目錄下之文件名。
    ls –a 列出包含以.起始的隱藏檔所有文件名。
    ls –t 依照文件最后修改時間之順序,依序列出文件名。
    ls –F 列出目前目錄下之文件名及其類型。"/" 結(jié)尾表示為目錄名稱,

    "*" 結(jié)尾表示為執(zhí)行檔,"@" 結(jié)尾表示為 symblic link。

    ls –l 列出目錄下所有文件之許可權(quán)、擁有者、文件大小、修改時間及名稱。
    ls –lg 同上,并顯示出文件之擁有者群組名稱。
    ls –R 顯示出目錄下,以及其所有子目錄之文件名。( recursive listing )

    2.2 目錄之縮寫:

    ~ 使用者 login 時的 working directory ( 起始目錄 )
    ~username 指定某位 user 的 working directory ( 起始目錄 )
    .. 目前的工作目錄 ( current working directory )
    .. 目前目錄的上一層目錄 ( parent of working directory)

    2.3 改變工作目錄位置
    執(zhí)行格式:cd [name] :name 可為目錄名稱、路徑或目錄縮寫。

    Example:

    cd 改變目錄位置,至使用者 login 時的 working directory (起始目錄)。
    cd dir1 改變目錄位置,至 dir1 之目錄位置下。
    cd ~user 改變目錄位置,至使用者的 working directory (起始目錄)。
    cd .. 改變目錄位置,至目前目錄的上層( 即 parent of working directory)
    cd ../user 改變目錄位置,至相對路徑 user 之目錄位置下。
    cd /../.. 改變目錄位置,至絕對路徑( Full path ) 之目錄位置下。

    2.4 復制文件
    執(zhí)行格式: cp [-r] source destination

    Example:

    cp file1 file2 將文件 file1 復制成 file2
    cp file1 dir1 將文件 file1 復制到目錄 dir1 下,文件名仍為 file1。
    cp /tmp/file1 將目錄 /tmp 下的文件 file1 復制到現(xiàn)行目錄下,文件名仍為 file1。
    cp /tmp/file1 file2 將目錄 /tmp 下的文件 file1 復制到現(xiàn)行目錄下,文件名為 file2
    cp -r dir1 dir2 (recursive copy) 復制整個目錄。

    若目錄 dir2 不存在,則將目錄 dir1,及其所有文件和子目錄,復制到目錄 dir2 下,新目錄名稱為 dir1。若目錄 dir2 不存在,則將dir1,及其所有文件和子目錄,復制為目錄 dir2。

    2.5 移動或更改文件、目錄名稱
    執(zhí)行格式: mv source destination

    Example:

    mv file1 file2 將文件 file1,更改文件名為 file2。
    mv file1 dir1 將文件 file1,移到目錄 dir1下,文件名仍為 file1。
    mv dir1 dir2 若目錄 dir2 不存在,則將目錄 dir1,及其所有文件和子目錄,移到目錄 dir2 下,新目錄名稱為 dir1。若目錄 dir2 不存在,則將dir1,及其所有文件和子目錄,更改為目錄 dir2。

    2.6 建立新目錄
    執(zhí)行格式: mkdir directory-name

    Exmaple :

    mkdir dir1 建立一新目錄 dir1。

    2.7 刪除目錄
    執(zhí)行格式: rmdir directory-name 或 rm directory-name

    Example :

    rmdir dir1 刪除目錄 dir1,但 dir1 下必須沒有文件存在,否則無法刪除。
    rm -r dir1 刪除目錄 dir1,及其下所有文件及子目錄。

    2.8 刪除文件
    執(zhí)行格式: rm filename (filename 可為文件名,或文件名縮寫符號。)

    Example :

    rm file1 刪除文件名為 file1 之文件。
    rm file? 刪除文件名中有五個字符,前四個字符為file 之所有文件。
    rm f* 刪除文件名中,以 f 為字首之所有文件。

    2.9 文件名的縮寫符號
    ? 代表文件名稱中之單一字符。
    * 代表文件名稱中之一字串。

    2.10 列出目前所在之目錄位置
    執(zhí)行格式: pwd

    2.11 查看文件內(nèi)容
    執(zhí)行格式: cat filename
    Example :

    cat file1 以連續(xù)顯示方式,查看文件名 file1 之內(nèi)容。

    執(zhí)行格式: more filename 或 cat filename | more
    Example :

    more file1 以分頁方式,查看文件名 file1 之內(nèi)容。
    cat file1 | more 同上。

    2.12 查看目錄所占磁盤容量
    執(zhí)行格式: du [-s] directory
    Example :

    du dir1 顯示目錄 dir1 的總?cè)萘考捌浯文夸浀娜萘?以 k byte 為容量)。
    du -s dir1 顯示目錄 dir1 的總?cè)萘俊?/p>

    2.13 查看自己的 disk quota 使用狀況
    disk quota : 工作站磁盤空間的使用限額。
    執(zhí)行格式: quota -v
    Example :

    quota -v 將會顯示下列信息
    Filesystem usage quota limit timeleft files quota limit timelef.
    /home/ice/u01 9344 8192 12288 1.9 days 160 0 0

    欄位解說:
    usage : 目前的磁盤用量。
    quota : 你的磁盤使用額度。當你的 usage 超過 quota 時,雖然可以繼續(xù)使用,但是必須七天之內(nèi)降到 quota 以下,否則即使用量沒有超 limit(最高限額),也無法再寫入或復制任何文件。
    limit : 最高使用額度。當你的 usage 達到 limit 時,無法再寫入或復制任何文件。

    3. 文件傳輸
    3.1 拷貝文件或目錄至遠端工作站
    執(zhí)行格式: rcp [-r] source hostnome:destination
    source 可為文件名、目錄名或路徑,hostnome 為工作站站名,destination 為路徑名稱.
    Example :

    rcp file1 doc:/home/user
    將文件 file1,拷貝到工作站 doc 路徑 /home/user 之目錄下。
    rcp -r dir1 doc:/home/user
    將目錄 dir1,拷貝到工作站 doc 路徑/home/user 之目錄下。

    3.2 自遠端工作站,拷貝文件或目錄
    執(zhí)行格式: rcp [-r] hostname:source destination
    ( hostname 為工作站名,source 為路徑名,destination 可為文件名、目錄名或路徑 )。
    Example :

    rcp doc:/home/user/file1 file2
    將工作站 doc 中,位于 /home/user 目錄下之目錄 dir1,拷貝到目前工作站之目錄下,目錄名稱仍為 dir1。
    rcp -r doc:/home/user/dir1 .
    將工作站 iis1 中,位于 /home/user 目錄下之目錄 dir1,拷貝到目前工作站之目錄下目錄名稱仍為 dir1。

    3.3 本地工作站與遠端工作站之間文件傳輸
    ( 必須擁有遠端工作站之帳號及密碼,才可進行傳輸工作 )
    執(zhí)行格式: ftp hostname or ftp ip_address
    Example :

    ftp doc 與遠端工作站 doc ,進行文件傳輸
    Name (doc:user-name) : 輸入帳號
    Password (doc:user-name): 輸入密碼
    ftp> help 列出 ftp 文件傳輸,可使用之任何命令。
    ftp> !ls 列出本地工作站,目前目錄下之所有文件名。
    ftp> !pwd 列出本地工作站,目前所在之工作目錄位置。
    ftp> ls 列出遠端工作站目前目錄下之所有文件名。
    ftp> dir 列出遠端工作站目前目錄下之所有文件名(略同于 UNIX 的 ls -l 指令).
    ftp> dir . |more 同上,但每頁會暫停(可能不適用 Unix 以外的 ftp)。
    ftp> pwd 列出遠端工作站目前所在之目錄位置。
    ftp> cd dir1 更改遠端工作站之工作目錄位置至 dir1 之下。
    ftp> get file1 將遠端工作站之文件 file1 ,拷貝到本地工作站中。
    ftp> put file2 將本地工作站之文件 file2 ,拷貝到遠端工作站中。
    ftp> mget *.c 將遠端工作站中,副文件名為 c 之所有文件,拷貝到本地工作站中。
    ftp> mput *.txt 將本地工作站中,副文件名為 txt 之所有文件,拷貝遠端工作站中。
    ftp> prompt 切換交談式指令(使用 mput/mget 時不用每個文件皆詢問yes/no)。
    ftp> quit 結(jié)束 ftp 工作。
    ftp> bye 結(jié)束 ftp 工作。

    注: 從PC與工作站間的文件傳輸也可透過在 PC端的 FTP指令進行文件傳輸,指令用法與上所述大致相同。

    4. 文件模式之設定
    4.1 改變文件或目錄之讀、寫、執(zhí)行之允許權(quán)
    執(zhí)行格式:chmod [-R] mode name
    ( name 可為文件名或目錄名;mode可為 3 個 8 位元之數(shù)字,或利用ls -l 命令,列出文件或目錄之讀、寫、執(zhí)行允許權(quán)之文字縮寫。)
    mode : rwx rwx rwx r:read w:write x:execute
    user group other
    縮寫 : (u) (g) (o)
    Example :

    %chmod 755 dir1
    將目錄dir1,設定成任何使用者,皆有讀取及執(zhí)行之權(quán)利,但只有擁有者可做修改。
    %chmod 700 file1
    將文件file1,設定只有擁有者可以讀、寫和執(zhí)行。
    %chmod o+x file2
    將文件file2,增加擁有者可以執(zhí)行之權(quán)利。
    %chmod g+x file3
    將文件file3,增加群組使用者可執(zhí)行之權(quán)利。
    %chmod o-r file4
    將文件file4,除去其它使用者可讀取之權(quán)利。

    4.2 改變文件或目錄之擁有權(quán)
    執(zhí)行格式:chown [-R] username name ( name 可為文件名或目錄名。)
    Example :

    %chown user file1
    將文件 file1 之擁有權(quán),改為使用者 user 所有。
    %chown -R user dir1
    將目錄 dir1,及其下所有文件和子目錄之擁有權(quán),改為使用者 user 所有。

    4.3 檢查自己所屬之群組名稱
    執(zhí)行格式:groups

    4.4 改變文件或目錄之群組擁有權(quán)
    執(zhí)行格式:chgrp [-R] groupname name ( name 可為文件名或目錄名 )
    Example :

    %chgrp vlsi file1
    將文件 file1 之群組擁有權(quán),改為 vlsi 群組。
    %chgrp -R image dir1
    將目錄dir1,及其下所有文件和子目錄,改為 image 群組。

    4.5 改變文件或目錄之最后修改時間
    執(zhí)行格式:touch name ( name 可為文件或目錄名稱。)

    4.6 文件之連結(jié)
    同一文件,可擁有一個以上之名稱,可將文件做數(shù)個連結(jié)。
    執(zhí)行格式:ln oldname newname ( Hard link )
    Example :

    ln file1 file2   將名稱 file2,連結(jié)至文件 file1。

    執(zhí)行格式:ln -s oldname newname ( Symblick link )
    Example :

    ln -s file3 file4 將名稱 file4,連結(jié)至文件file3。

    4.7 文件之字串找尋
    執(zhí)行格式:grep string file
    Example :

    grep abc file1

    尋找文件file1中,列出字串 abc 所在之整行文字內(nèi)容。

    4.8 找尋文件或命令之路徑
    執(zhí)行格式:whereis command ( 顯示命令之路徑。)
    執(zhí)行格式:which command ( 顯示命令之路徑,及使用者所定義之別名。)
    執(zhí)行格式:whatis command ( 顯示命令功能之摘要。)
    執(zhí)行格式:find search-path -name filename -print
    ( 搜尋指定路徑下,某文件之路徑 。)
    Example :

    %find / -name file1 -print ( 自根目錄下,尋找文件名為 file1 之路徑。.

    4.9 比較文件或目錄之內(nèi)容
    執(zhí)行格式:diff [-r] name1 name2 ( name1 name2 可同時為文件名,或目錄名稱。)
    Example :

    %diff file1 file2
    比較文件 file1 與 file2 內(nèi),各行之不同處。
    %diff -r dir1 dir2
    比較目錄 dir1 與 dir2 內(nèi),各文件之不同處。

    4.10 文件打印輸出
    使用者可用 .login 檔中之 setenv PRINTER,來設定打印資料時的打印機名。
    printername :sp1 或 sp2
    Example :

    %setenv PRINTER sp2 設定自 sp2 打印資料。

    4.11 一般文件之打印
    執(zhí)行格式:lpr [-Pprinter-name] filename
    %lpr file1 或 lpr -Psp2 file1
    自 sp2,打印文件 file1。
    執(zhí)行格式:enscript [-Pprinter-name] filename
    %enscript file3 或 enscript -Psp1 file3
    自 sp1 打印文件 file3。

    4.12 troff 文件之打印
    執(zhí)行格式:ptroff [-Pprinter-name] [-man][-ms] filename

    %ptroff -man /usr/local/man/man1/ptroff.1
    以 troff 格式,自 Apple laser writer 打印 ptroff 命令之使用說明。
    %ptroff -Psp2 -man /usr/man/man1/lpr1
    以 troff 格式,自 sp2 打印 lpr 命令之使用說明。

    5. 打印機控制命令
    5.1 檢查打印機狀態(tài),及打印工作順序編號和使用者名稱
    執(zhí)行格式:lpq [-Pprinter -name]

    %lpq 或 lpq -Psp1
    檢查 sp1 打印機之狀態(tài)。

    5.2 刪除打印機內(nèi)之打印工作 (使用者僅可刪除自己的打印工作 )
    執(zhí)行格式:lprm [-Pprinter -name] username 或 job number

    %lprm user 或 lprm -Psp1 user
    刪除 sp1 中,使用者 user 的打印工作,此時使用者名稱必須為 user。
    %lprm -Psp2 456
    刪除 sp2 編號為 456 之打印工作。

    6. Job 之控制
    UNIX O.S.,可于 foregrourd 及 background 同時處理多個 process。

    一般使用者執(zhí)行命令時,皆是在 foreground 交談式地執(zhí)行 process,亦可將 process置于 background 中,以非交談式來執(zhí)行 process。

    6.1 查看系統(tǒng)之 process
    執(zhí)行格式:ps [-aux]
    Example:

    %ps 或 ps –x (查看系統(tǒng)中,屬于自己的 process。)
    %ps –au (查看系統(tǒng)中,所有使用者的 process。)
    %ps –aux (查看系統(tǒng)中,包含系統(tǒng)內(nèi)部,及所有使用者的 process。)

    6.2 結(jié)束或終止 process
    執(zhí)行格式:kill [-9] PID ( PID 為利用 ps 命令所查出之 process ID。)
    Example:

    %kill 456 或 kill -9 456
    終止 process ID 為 456 之 process。

    6.3 在 background 執(zhí)行 process 的方式
    執(zhí)行格式:command & (于 command 后面加入一 "&" 符號即可。)
    Example:

    %cc file1.c &
    將編譯 file1.c 文件之工作,置于 background 執(zhí)行。

    執(zhí)行格式:按下 "Control Z" 鍵,暫停正在執(zhí)行的 process。鍵入 "bg" 命令,將所暫停的 process,置入 background 中繼續(xù)執(zhí)行。
    Example:
    %cc file2.c
    ^Z
    Stopped
    %bg

    6.4 查看正在 background 中執(zhí)行的 process
    執(zhí)行格式:jobs

    6.5 結(jié)束或終止在 background 中的 process
    執(zhí)行格式:kill %n
    (n 為利用 "jobs" 命令,所查看出的 background job 編號)
    Example:
    %kill % 終止在 background 中的第一個 job。
    %kill %2 終止在 background 中的第二個 job。

    7. shell varialbe
    7.1 查看 shell variable 之設定值
    執(zhí)行格式:set 查看所有 shell variable 之設定值。
    %set
    執(zhí)行格式:echo $variable-name 顯示指定的 shell variable 之設定值。
    %echo $PRINTER
    sp1

    7.2 設定 shell variable
    執(zhí)行格式:set var value
    Example:
    %set termvt100
    設定 shell variable "term" 為 VT100 終端機之型式。

    7.3 刪除 shell variable
    執(zhí)行格式:unset var
    Example:
    %unset PRINTER
    刪除 shell variable "PRINTER" 之設定值。

    8. environment variable
    8.1 查看 environment variable 之設定值
    執(zhí)行格式:setenv  查看所有 environment variable 之設定值。
    Example: %setenv
    執(zhí)行格式:echo $NAME 顯示指定的 environment variable "NAME" 之設定值。
    Example:
    %echo $PRINTER
    顯示 environment variable "PRINTER" 打印機名稱之設定值。

    8.2 設定 environment variable
    執(zhí)行格式:setenv NAME word
    Example:
    %setenv PRINTER sp1
    設定 environment variable "PRINTER" 打印機名稱為 sp1。

    8.3 刪除 environment variable
    執(zhí)行格式:unsetenv NAME
    Example:
    %unsetenv PRINTER
    刪除 environment variable "PRINTER" 打印機名稱之設定值。

    9. alias
    9.1 查看所定義的命令之 alias
    執(zhí)行格式: alias 查看自己目前定義之所有命令,及所對應之 alias 名稱。
    執(zhí)行格式: alias name 查看指定之 alias 名稱所定義之命令。
    Example:
    %alias dir (查看別名 dir 所定義之命令)
    ls -atl

    9.2 定義命令之 alias
    執(zhí)行格式: alias name \'command line\'
    Example:
    % alias dir \'ls -l\'
    將命令 "ls - l" 定義別名為 dir。

    9.3 刪除所定義之 alias
    執(zhí)行格式: unalias name
    Example:
    %unalias dir (刪除別名為 dir 之定義。)
    %unalias * (刪除所有別名之設定。)

    10. history
    10.1 設定命令記錄表之長度
    執(zhí)行格式: set history n

    Example:

    %set history 40

    設定命令記錄表之長度為 40 (可記載執(zhí)行過之前面 40 個命令)。

    10.2查看命令記錄表之內(nèi)容
    執(zhí)行格式: history

    10.3 使用命令記錄表
    執(zhí)行格式: !!

    Example: %!! (重復執(zhí)行前一個命令)
    執(zhí)行格式: !n ( n 為命令記錄表之命令編號。)
    Example: %!5 ( 執(zhí)行命令記錄表中第五個命令。)
    執(zhí)行格式: !string ( 重復前面執(zhí)行過以 string 為起始字符之命令。)
    Example: %!cat ( 重復前面執(zhí)行過,以 cat 為起始字符之命令。)

    10.4 顯示前一個命令之內(nèi)容
    執(zhí)行格式: !!:p

    10.5 更改前一命令之內(nèi)容并執(zhí)行之
    執(zhí)行格式: ^oldstring ^newstring
    將前一命令中 oldstring 的部份,改成 newstring,并執(zhí)行之。
    Example:
    %find . -name file1.c -print
    ^file1.c^core
    %find . -name core -print
    注:文件 core 為執(zhí)行程序或命令發(fā)生錯誤時,系統(tǒng)所產(chǎn)生的文件。作為偵錯(debug)之,因其所占空間極大,通常將之刪除。

    11. 資料之壓縮
    為了避免不常用的文件或資料,占用太大的磁盤空間,請使用者將之壓縮。欲使用壓縮過的文件或資料前,將之反壓縮,即可還原成原來之資料型式。凡是經(jīng)過壓縮處理之文件,會在文件名后面附加 " .Z " 之字符,表示此為一壓縮文件。

    11.1 壓縮資料
    執(zhí)行格式:compress filename 壓縮文件
    執(zhí)行格式:compressdir directory-name 壓縮目錄

    11.2 解壓縮還原資料

    執(zhí)行格式:uncompress filename 反壓縮文件
    執(zhí)行格式:uncompressdir directory-name 反壓縮目錄

    12. pipe-line 之使用
    執(zhí)行格式:command1 | command2
    將 command1 執(zhí)行結(jié)果,送到 command2 做為 command2 的輸入。
    Example:

    %ls -Rl | more
    以分頁方式,列出目前目錄下所有文件,及子目錄之名稱。
    %cat file1 | more
    以分頁方式,列出文件 file1 之內(nèi)容。

    13. I/O control
    13.1 標準輸入之控制
    執(zhí)行格式:command-line < file
    將 file 做為 command-line 之輸入。
    Example:
    %mail -s "mail test" user@iis.sinica.edu.tw < file1
    將文件 file1 當做信件之內(nèi)容,Subject 名稱為 mail test,送給收信人。

    13.2 標準輸出之控制
    執(zhí)行格式:command > filename
    將 command 之執(zhí)行結(jié)果,送至指定的 filename 中。
    Example: %ls -l > list
    將執(zhí)行 "ls -l" 命令之結(jié)果,寫入文件 list 中。
    執(zhí)行格式:command >! filename
    同上,若 filename 之文件已經(jīng)存在,則強迫 overwrite。
    Example: %ls -lg >! list
    將執(zhí)行 "ls - lg" 命令之結(jié)果,強迫寫入文件 list 中。
    執(zhí)行格式:command >& filename
    將 command 執(zhí)行時,屏幕上所產(chǎn)生的任何信息,寫入指定的 filename 中。
    Example: %cc file1.c >& error
    將編譯 file1.c 文件時,所產(chǎn)生之任何信息,寫入文件 error 中。
    執(zhí)行格式:command >> filename
    將 command 執(zhí)行結(jié)果,附加(append)到指定的 filename 中。
    Example: %ls - lag >> list
    將執(zhí)行 "ls - lag" 命令之結(jié)果,附加(append)到文件 list 中。
    執(zhí)行格式:command >>& filename
    將 command 執(zhí)行時,屏幕上所產(chǎn)生的任何信息,附加于指定的 filename中。
    Example: %cc file2.c >>& error
    將編譯 file2.c 文件時,屏幕所產(chǎn)生之任何信息,附加于文件 error 中。

    14. 查看系統(tǒng)中的使用者
    執(zhí)行格式: who 或 finger
    執(zhí)行格式: w
    執(zhí)行格式: finger username or finger username@domainname

    15. 改變自己的 username 進入其他使用者的帳號,擁有其使用權(quán)利。
    執(zhí)行格式: su username
    Example:
    %su user 進入使用者 user 之帳號
    passwrod: 輸入使用者 user 之密碼

    16. 查看 username
    執(zhí)行格式: whoami 查看 login 時,自己的 username。
    執(zhí)行格式: whoami 查看目前的 username。若已執(zhí)行過 "su"命令tch user),則顯示出此 user 之 username。

    17. 查看目前本地所有工作站的使用者
    執(zhí)行格式: rusers
    > 結(jié)束

    18. 與某工作站上的使用者交談
    執(zhí)行格式: talk username@hostname 或 talk username@ip_address
    Example:
    1. 可先利用 rusers 指令查看網(wǎng)路上的使用者
    2. 假設自己的帳號是 u84987 ,在工作站 indian 上使用,現(xiàn)在想要與 doc 上的u84123 交談。
    %talk u84123@doc > 此時屏幕上將會出現(xiàn)等待畫面
    在對方(u84123)屏幕上將會出現(xiàn)下列信息
    Message from Talk_Daemon@Local_host_name at xx:xx
    talk: connection requested by u84987@indian
    talk: respond with: talk u84987@indian
    此時對方(u84123) 必須執(zhí)行 talk u84987@indian 即可互相交談。最后可按結(jié)束。

    19. 檢查遠端電腦系統(tǒng)是否正常
    執(zhí)行格式:ping hostname 或 ping IP-Address
    Example:
    %ping doc

    20. 電子郵件(E-mail)的使用簡介
    20.1將文件當做 E-mail 的內(nèi)容送出
    執(zhí)行格式:mail -s "Subject-string" username@address < filename
    %mail -s "program" user < file.c
    將 file.c 當做 mail 的內(nèi)容,送至 user, subject name 為 program。
    20.2 傳送 E-mail 給本地使用者
    執(zhí)行格式:mail username
    %mail user
    20.3 傳送 E-mail 至 外地
    執(zhí)行格式: mail username@receiver-address
    Example
    %mail paul@gate.sinica.edu.tw
    Subject : mail test
    :
    :
    鍵入信文內(nèi)容
    :
    :
    按下 "Control D" 鍵或 " . " 鍵結(jié)束信文。
    連按兩次 "Control C" 鍵,則中斷工作,不送此信件。
    Cc:
    ( Carbon copy : 復制一份信文,給其他的收信人 )

    20.4 檢查所傳送之 E-mail 是否送出,或滯留于本所之郵件伺服站中
    執(zhí)行格式:/usr/lib/sendmail -bp

    ( 若屏幕顯示為 "Mail queue is empty" 之信息,表示 mail 已送出。

    若為其它錯誤信息,表示 E-mail 因故尚未送出。)

    20.5 讀取信件
    執(zhí)行格式: mail

    常用指令如下:

    cd [directory] chdir to directory or home if none given

    d [message list] delete messages

    h print out active message headers

    m [user list] mail to specific users

    n goto and type next message

    p [message list] print messages

    q quit, saving unresolved messages in mbox

    r [message list] reply to sender (only) of messages

    R [message list] reply to sender and all recipients of messages

    s [message list] file append messages to file

    t [message list] type messages (same as print)

    u [message list] undelete messages

    v [message list] edit messages with display editor

    w [message list] file append messages to file, without from line

    x quit, do not change system mailbox

    z [-] display next [previous] page of headers

    ! shell escape

    21.文件編輯器 vi 之使用方法簡介
    vi、celvis(cvi) 是在工作站上被廣大使用的中英文編輯軟體。對初學者而言,常因其特殊的使用方法,而不得其門而入;對已經(jīng)在使用 vi 的使用者來說,也常見因?qū)?vi 的不熟悉或不夠了解,而無法發(fā)揮出 vi 強大的編輯能力,以下將介紹 vi 之使用方法簡介。

    21.1本文內(nèi)容大綱
    進入 vi

    離開 vi

    輸入模式

    如何進入輸入模式

    如何離開輸入模式

    指令模式

    光標的移動

    視窗的移動

    刪除、復制及修改指令介紹(delete、change、yank)

    刪除與修改(delete、replace)

    移動與復制(delete/put、yank/put)

    指令重復

    取消前一動作(undo)

    字串搜尋

    資料的連接與分行

    環(huán)境的設定

    ex 指令

    其它方面

    中文編輯

    恢復編輯時被中斷的文件

    編輯多個文件

    vi 是 visual editor 的縮寫,是 UNIX 所提供的編輯器之一。它提供使用者一個視窗的編輯環(huán)境,在此視窗下,使用者可編輯所要的文件。

    21.2 進入vi
    直接執(zhí)行 vi編輯程序即可:

    %vi test

    此刻屏幕上會出現(xiàn) vi 的編輯視窗,同時 vi 會將文件復制一份至記憶體中的緩沖區(qū) (buffer) 。 vi會保留在磁盤中的文件不變,而先對緩沖區(qū)的文件作編輯,編輯完成后,使用者可決定是否要取代原來舊有的文件。

    --------------------------------------------------------------------------------

    -- 作者:itvue
    -- 發(fā)布時間:2005-5-11 10:17:42

    --

    21.3 離開vi
    若在輸入模式下,則先利用《ESC》進入指令模式,而后即可選用下列指令

    離開vi。

    :q! 離開vi,并放棄剛在緩沖區(qū)內(nèi)編輯的內(nèi)容。

    :wq 將緩沖區(qū)內(nèi)的資料寫入磁盤中,并離開vi。

    :ZZ 同wq。

    :x 同wq。

    :w 將緩沖區(qū)內(nèi)的資料寫入磁盤中,但并不離開vi。

    :q 離開vi,若文件被修改過,則會被要求確認是否放棄修改的內(nèi)容。

    此指令可與:w 配合使用。

    21.4 vi 的操作模式
    vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 后,即處在指令模式下,此刻鍵入之任何字符皆被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。

    21.5 輸入模式
    如何進入輸入模式

    l a (append) 由光標之后加入資料。

    l A 由該行之末加入資料。

    l i (insert) 由光標之前加入資料。

    l I 由該行之首加入資料。

    l o (open) 新增一行于該行之下供輸入資料之用。

    l 新增一行于該行之上供輸入資料之用。

    如何離開輸入模式

    l 《ESC》 結(jié)束輸入模式。

    21.6 指令模式
    光標之移動

    l h 向左移一個字符。

    l J 向上移一個字符。

    l K 向下移一個字符。

    l L 向右移一個字符。

    l 移至該行之首

    l $ 移至該行之末。

    l ^ 移至該行的第一個字符處。

    l H 移至視窗的第一列。

    l M 移至視窗的中間那列。

    l L 移至視窗的最后一列。

    l G 移至該文件的最后一列。

    l + 移至下一列的第一個字符處。

    l - 移至上一列的第一個字符處。

    l ( 移至該句之首。 (注一)

    l ) 移至該句之末。

    l { 移至該段落之首。 (注二)

    l } 移至該段落之末。

    l nG 移至該文件的第 n 列。

    l n+ 移至光標所在位置之后的第 n 列。

    l 移至光標所在位置之前的第 n 列。

    l 會顯示該行之行號、文件名稱、文件中最末行之行號、光標所在行號占總行號之百分比。

    注一:句子(sentence)在vi中是指以『!』、『.』或『?』結(jié)束的一串字。

    注二:段落(paragraph)在vi中是指以空白行隔開的文字。

    21.7 視窗的移動

    l 視窗往下卷一頁。
    l 視窗往上卷一頁。
    l 視窗往下卷半頁。
    l 視窗往上卷半頁。
    l 視窗往下卷一行。
    l 視窗往上卷一行。

    21.8 刪除、復制及修改指令介紹 (此單元較少使用)
    d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:

    Operator + Scope command

    (運算子) (范圍)

    運算子:

    l d 刪除指令。刪除資料,但會將刪除資料復制到記憶體緩沖區(qū)。

    l y 將資料(字組、行列、句子或段落)復制到緩沖區(qū)。

    l p 放置(put)指令,與 d 和 y 配和使用。可將最后delete或yank的資料放置于光標所在位置之行列下。

    l c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句子等之資料,并插入新鍵資料。

    范圍:

    l e 由光標所在位置至該字串的最后一個字符。

    l w 由光標所在位置至下一個字串的第一個字符。

    l b 由光標所在位置至前一個字串的第一個字符。

    l $ 由光標所在位置至該行的最后一個字符。

    l 由光標所在位置至該行的第一個字符。

    l ) 由光標所在位置至下一個句子的第一個字符。

    l ( 由光標所在位置至該句子的第一個字符。

    l { 由光標所在位置至該段落的最后一個字符。

    l } 由光標所在位置至該段落的第一個字符。

    整行動作:

    l dd 刪除整行。

    l D 以行為單位,刪除光標后之所有字符。

    l cc 修改整行的內(nèi)容。

    l yy yank整行,使光標所在該行復制到記憶體緩沖區(qū)。

    21.9 刪除與修改
    l x 刪除光標所在該字符。

    l X 刪除光標所在之前一字符。

    l dd 刪除光標所在該行。

    l r 用接于此指令之后的字符取代(replace)光標所在字符。如: ra 將光標所在字符以 a 取代之。

    l R 進入取代狀態(tài),直到《ESC》為止。

    l s 刪除光標所在之字符,并進入輸入模式直到《ESC》。

    l S 刪除光標所在之該行資料,并進入輸入模式直到《ESC》。

    21.10 移動與復制
    利用 delete 及 put 指令可完成資料移動之目的。

    利用 yank 及 put 指令可完成資料復制之目的。

    yank 和 delete 可將指定的資料復制到記憶體緩沖區(qū),而藉由 put 指令可將緩沖區(qū)內(nèi)的資料復制到屏幕上。

    例:

    移動一行 .在該行執(zhí)行 dd

    .光標移至目的地

    .執(zhí)行 p

    復制一行 .在該行執(zhí)行 yy

    .光標移至目的地

    .執(zhí)行 p

    21.11 指令重復
    在指令模式中,可在指令前面加入一數(shù)字 n,則此指令動作會重復執(zhí)行 n次。

    例:

    刪除10行 .10dd

    復制10行 .10yy

    指標往下移10行 .10j

    21.12 取消前一動作(Undo)
    即復原執(zhí)行上一指令前的內(nèi)容。

    u 恢復最后一個指令之前的結(jié)果。

    U 恢復光標該行之所有改變。

    21.13 搜尋
    在vi中可搜尋某一字串,使光標移至該處。

    /字串 往光標之后尋找該字串。

    ?字串 往光標之前尋找該字串。

    n 往下繼續(xù)尋找下一個相同的字串。

    N 往上繼續(xù)尋找下一個相同的字串。

    21.14資料的連接
    J 句子的連接。將光標所在之下一行連接至光標該行的后面。

    若某行資料太長亦可將其分成兩行,只要將光標移至分開點,進入輸入模式 (可利用 a、i等指令)再按《Enter》即可。

    21.15 環(huán)境的設定
    :set nu 設定資料的行號。

    :set nonu 取消行號設定。

    :set ai 自動內(nèi)縮。

    :set noai 取消自動內(nèi)縮。

    自動內(nèi)縮(automatic indentation)

    在編輯文件或程序時,有時會遇到需要內(nèi)縮的狀況,『:set ai』即提供自動內(nèi)縮的功能,用下例解釋之:

    .vi test

    .(進入編輯視窗后)

    this is the test for auto indent

    《Tab》start indent ← :set ai (設自動內(nèi)縮)

    《Tab》data

    《Tab》data

    《Tab》data ← :set noai (取消自動內(nèi)縮)

    the end of auto indent.

    .注: 可刪除《Tab》字符。

    21.16 ex指令
    讀寫資料

    :w 將緩沖區(qū)的資料寫入磁盤中。

    :10,20w test 將第10行至第20行的資料寫入test文件。

    :10,20w>>test 將第10行至第20行的資料加在test文件之后。

    :r test 將test文件的資料讀入編輯緩沖區(qū)的最后。

    刪除、復制及移動

    :10,20d 刪除第10行至第20行的資料。

    :10d 刪除第10行的資料。

    :%d 刪除整個編輯緩沖區(qū)。

    :10,20co30 將第10行至第20行的資料復制至第30行之后。

    :10,20mo30 將第10行至第20行的資料移動至第30行之后。

    字串搜尋與取代

    s(substitute)指令可搜尋某行列范圍。g(global)指令則可搜尋整個編輯緩沖區(qū)的資料。

    s指令以第一個滿足該條件的字串為其取代的對象,若該行有數(shù)個滿足該條件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數(shù)。

    :1,$s/old/new/g 將文件中所有的『old』改成『new』。

    :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。

    :%s/old/new/g 將編輯緩沖區(qū)中所有的『old』改成『new』。

    21.17 恢復編輯時被中斷的文件
    在編輯過程中,若系統(tǒng)當?shù)艋蜻B線中斷,而緩沖區(qū)的資料并還未被寫回磁盤時,當再度回到系統(tǒng),執(zhí)行下列指令即可回復中斷前的文件內(nèi)容。

    %vi -r filename

    21.18 編輯多個文件

    vi亦提供同時編輯多個文件的功能,方法如下:

    %vi file1 file2 ...

    當?shù)谝粋€文件編修完成后,可利用『:w』將該緩沖區(qū)存檔,而后再利用 『:n』載入下一個文件。

    posted @ 2008-06-13 23:13 xzc 閱讀(441) | 評論 (0)編輯 收藏
    僅列出標題
    共32頁: First 上一頁 17 18 19 20 21 22 23 24 25 下一頁 Last 
    主站蜘蛛池模板: 亚洲欧美熟妇综合久久久久| 在线视频免费国产成人 | 亚洲人成免费网站| 国产l精品国产亚洲区在线观看| 国产亚洲情侣久久精品| 免费观看午夜在线欧差毛片| 亚洲AV色无码乱码在线观看| 精品国产免费观看久久久| 亚洲av成人片在线观看| 国产男女猛烈无遮档免费视频网站| 亚洲成a∨人片在无码2023| 日本特黄特色免费大片| 羞羞漫画登录页面免费| 亚洲午夜精品一级在线播放放| h视频在线免费观看| 国产国拍亚洲精品mv在线观看| 久久九九AV免费精品| 亚洲精品电影在线| 卡1卡2卡3卡4卡5免费视频| 国产精品久久亚洲一区二区 | 人人狠狠综合久久亚洲88| 日韩免费电影网址| 亚洲国产成a人v在线| 暖暖免费高清日本中文| 国产日韩在线视频免费播放| 亚洲av之男人的天堂网站| AV无码免费永久在线观看| 精品女同一区二区三区免费播放 | 麻豆69堂免费视频| 亚洲五月综合缴情在线观看| 91老湿机福利免费体验| 中文字幕亚洲男人的天堂网络| 国产亚洲福利一区二区免费看| 免费在线观影网站| 亚洲人成电影网站| 亚洲精品偷拍视频免费观看| 日韩免费无码一区二区三区| 亚洲日韩AV一区二区三区中文| 亚洲综合另类小说色区| 野花高清在线电影观看免费视频| 老司机精品视频免费|