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

          Java語法總結 - 線程

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

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


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

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


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

          5、線程的創建。
          創建線程有兩種方式:
          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!");
                  }
              }

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

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

          B、實現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對象。這樣就把線程相關的代碼和線程要執行的代碼分離開來。

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

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

          6、什么時候線程是活的?
          在調用start()方法開始執行線程之前,線程的狀態還不是活的。測試程序如下:
              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());
                  }
              }

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

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

          8、給線程起個有意義的名字。
          沒有該線程命名的話,線程會有一個默認的名字,格式是:“Thread-”加上線程的序號,如:Thread-0
          這看起來可讀性不好,不能從名字分辨出該線程具有什么功能。下面是給線程命名的方式。
          第一種:用setName()函數
          第二種:選用帶線程命名的構造器
              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();
                  }
              }
          在我的電腦上運行的結果是:
          Thread-0
          Thread-1
          Thread-3
          Thread-5
          Thread-2
          Thread-7
          Thread-4
          Thread-9
          Thread-6
          Thread-8
          而且每次運行的結果都是不同的!繼續引用前面的話,一旦涉及到線程,其運行多半是沒有保障。這個保障是指線程的運行完全是由調度程序控制的,我們沒法控制它的執行順序,持續時間也沒有保障,有著不可預料的結果。


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

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

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

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

          E、死亡狀態。
          一個線程的run()方法運行結束,那么該線程完成其歷史使命,它的棧結構將解散,也就是死亡了。但是它仍然是一個Thread對象,我們仍可以引用它,就像其他對象一樣!它也不會被垃圾回收器回收了,因為對該對象的引用仍然存在。
          如此說來,即使run()方法運行結束線程也沒有死啊!事實是,一旦線程死去,它就永遠不能重新啟動了,也就是說,不能再用start()方法讓它運行起來!如果強來的話會拋出IllegalThreadStateException異常。如:
          t.start();
          t.start();
          放棄吧,人工呼吸或者心臟起搏器都無濟于事……線程也屬于一次性用品。

          11、阻止線程運行。
          A、睡眠。sleep()方法
          讓線程睡眠的理由很多,比如:認為該線程運行得太快,需要減緩一下,以便和其他線程協調;查詢當時的股票價格,每睡5分鐘查詢一次,可以節省帶寬,而且即時性要求也不那么高。
          用Thread的靜態方法可以實現Thread.sleep(5*60*1000); 睡上5分鐘吧。sleep的參數是毫秒。但是要注意sleep()方法會拋出檢查異常InterruptedException,對于檢查異常,我們要么聲明,要么使用處理程序。
              try {
                  Thread.sleep(20000);
              }
              catch (InterruptedException ie) {
                  ie.printStackTrace();
              }
          既然有了sleep()方法,我們是不是可以控制線程的執行順序了!每個線程執行完畢都睡上一覺?這樣就能控制線程的運行順序了,下面是書上的一個例子:
              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();            
                  }
              }

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

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

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

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

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

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

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

          靜態Thread.yield()方法。
          它的作用是讓當前運行的線程回到可運行狀態,以便讓具有同等優先級的其他線程運行。用yield()方法的目的是讓同等優先級的線程能適當地輪轉。但是,并不能保證達到此效果!因為,即使當前變成可運行狀態,可是還有可能再次被JVM選中!也就是連任。

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

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



          附: 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.


          熱心網友翻譯的版本:

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

          • 摘要:本文通過java代碼啟動多個java子進程。必如在Java中通過Runtime中的exec方法執行java classname。如果執行成功,這個方法返回一個Process對象,如果執行失敗,將拋出一個IOException錯誤。
          • 標簽:Java  多進程  模式  分析

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

          在Java中我們可以使用兩種方法來實現這種要求。最簡單的方法就是通過Runtime中的exec方法執行java classname。如果執行成功,這個方法返回一個Process對象,如果執行失敗,將拋出一個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("被調用成功!");
           }
          }

          // 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運行程序后,發現在C盤多了個Test1.txt文件,但在控制臺中并未出現“被調用成功!”的輸出信息。因此可以斷定,Test已經被執行成功,但因為某種原因,Test的輸出信息未在Test_Exec的控制臺中輸出。這個原因也很簡單,因為使用exec建立的是Test_Exec的子進程,這個子進程并沒有自己的控制臺,因此,它并不會輸出任何信息。

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

                      

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

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

          exec方法經過了多次的重載。上面使用的只是它的一種重載。它還可以將命令和參數分開,如exec(“java.test2”)可以寫成exec(“java”, “test2”)。exec還可以通過指定的環境變量運行不同配置的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一樣,也可設置可執行文件的環境信息、工作目錄等。下面的例子描述了如何使用ProcessBuilder設置這些信息。

                      

          ProcessBuilder pb = new ProcessBuilder("Command", "arg2", "arg2", ''');
          // 設置環境變量
          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 閱讀(690) | 評論 (3)編輯 收藏
          關鍵字: 相對路徑 絕對路徑
          1.基本概念的理解

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

          相對路徑:相對與某個基準目錄的路徑。包含Web的相對路徑(HTML中的相對目錄),例如:在
          Servlet中,"/"代表Web應用的跟目錄。和物理路徑的相對表示。例如:"./" 代表當前目錄,"../"代表上級目錄。這種類似的表示,也是屬于相對路徑。
          另外關于URI,URL,URN等內容,請參考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類中獲得絕對路徑
          根據java.io.File的Doc文擋,可知:
          默認情況下new File("/")代表的目錄為:System.getProperty("user.dir")。
          一下程序獲得執行類的當前路徑

           
          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類獲得當前路徑(來自網絡)

          (1).Weblogic

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

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

          (2).Tomcat

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

          (3).Resin

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

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

          在Java文件中getResource或getResourceAsStream均可

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

          發布根路徑下WEB-INF/classes

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

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

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

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

          6.Java中文件的常用操作(復制,移動,刪除,創建等)(來自網絡)
          常用 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中文網)
          http://www.51cto.com/html/2005/1108/10947.htm

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

          總結:
          通過上面內容的使用,可以解決在Web應用服務器端,移動文件,查找文件,復制
          刪除文件等操作,同時對服務器的相對地址,絕對地址概念更加清晰。
          建議參考URI,的RFC標準文擋。同時對Java.io.File. Java.net.URI.等內容了解透徹
          對其他方面的理解可以更加深入和透徹。
          posted @ 2008-11-11 11:54 xzc 閱讀(647) | 評論 (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 + "\"");
          //循環取出流中的數據
          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 閱讀(393) | 評論 (0)編輯 收藏
               摘要: Dom4j的使用(全而好的文章) 關鍵字: dom4j Dom4j 使用簡介 作者:冰云 icecloud(AT)sina.com 時間:2003.12.15   版權聲明: 本文由冰云完成,首發于CSDN,未經許可,不得使用于任何...  閱讀全文
          posted @ 2008-10-31 11:33 xzc 閱讀(452) | 評論 (0)編輯 收藏

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

              我們在開發web系統時有時會有以下需求:

          • 希望某類或者某已知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方法,該方法很簡單,主要為了解決包含非英文/數字名稱的問題,比如說文件名為“衣明志.doc”,使用該方法客戶端就不會出現亂碼了。

           需要注意以下幾個問題:

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

          可參看以下幾篇文檔:

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

           

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

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

          對于UTF-8編碼格式的文本文件,其前3個字節的值就是-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等文本),可以采用一個現成的開源項目:cpdetector,它所在的網址是:http://cpdetector.sourceforge.net/。它的類庫很小,只有500K左右,利用該類庫判定文本文件的代碼如下:
          Java代碼 復制代碼
          1. /*------------------------------------------------------------------------  
          2.   detector是探測器,它把探測任務交給具體的探測實現類的實例完成。  
          3.   cpDetector內置了一些常用的探測實現類,這些探測實現類的實例可以通過add方法  
          4.   加進來,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。    
          5.   detector按照“誰最先返回非空的探測結果,就以該結果為準”的原則返回探測到的  
          6.   字符集編碼。  
          7. --------------------------------------------------------------------------*/  
          8. cpdetector.io.CodepageDetectorProxy detector =   
          9. cpdetector.io.CodepageDetectorProxy.getInstance();   
          10. /*-------------------------------------------------------------------------  
          11.   ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構造方法中的參數用于  
          12.   指示是否顯示探測過程的詳細信息,為false不顯示。  
          13. ---------------------------------------------------------------------------*/  
          14. detector.add(new cpdetector.io.ParsingDetector(false));    
          15. /*--------------------------------------------------------------------------  
          16.   JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數文件的編碼  
          17.   測定。所以,一般有了這個探測器就可滿足大多數項目的要求,如果你還不放心,可以  
          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不僅可以用于探測文件的編碼,也可以探測任意輸入的文本流的編碼,方法是調用其重載形式:
          Java代碼 復制代碼
          1. charset=detector.detectCodepage(待測的文本輸入流,測量該流所需的讀入字節數);  

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

          判定文件編碼的具體應用舉例:
          屬性文件(.properties)是Java程序中的常用文本存儲方式,象STRUTS框架就是利用屬性文件存儲程序中的字符串資源。它的內容如下所示:
          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方法讀入屬性文件雖然方便,但如果屬性文件中有中文,在讀入之后就會發現出現亂碼現象。發生這個原因是load方法使用字節流讀入文本,在讀入后需要將字節流編碼成為字符串,而它使用的編碼是“iso-8859-1”,這個字符集是ASCII碼字符集,不支持中文編碼,所以這時需要使用顯式的轉碼:
          Java代碼 復制代碼
          1. String value=prop.getProperty("屬性名");   
          2. String encValue=new String(value.getBytes("iso-8859-1"),"屬性文件的實際編碼");   

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

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

          1.1 ls

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

          1.2 pwd

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

          1.3 cd

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

          [語法]: mkdir [-m 模式] [-p] 目錄名
          [說明]: 本命令用于建立目錄,目錄的存取模式由掩碼(umask)決定,要求對其父目錄具有寫權限,目錄的UID和GID為實際UID和GID
          -m 按指定存取模式建立目錄
          -p 建立目錄時建立其所有不存在的父目錄
          [例子]:
          mkdir tmp 在當前目錄下建立子目錄 tmp
          mkdir -m 777 /tmp/abc 用所有用戶可讀可寫可執行的存取模式
          建立目錄 /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 刪除所有已經為空的父目錄
          -s 當使用-p 選項時,出現錯誤不提示
          [例子]:
          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為八進制數字,
          其他非打印字符顯示成M-x , x 為該字符低7位的8進制數值
          -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] [- 行數] [+ 行數] [+ / 模式 ] [ 文件 ... ]
          [說明]: 將文件顯示在終端上,每次一屏,在左下部顯示 --more--,若是從文件讀出而非從管道,則在后面顯示百分比,表示已顯示的部分,按回車鍵則上滾一行,按空格鍵則上滾一屏,未顯示完時可以使用more 命令中的子命令。
          -c 顯示文件之前先清屏
          -d 當輸錯命令時顯示錯誤信息而不是響鈴(bell)
          -f 不折疊顯示長的行
          -l 不將分頁控制符(CTRL D)當作頁結束
          -r 一般情況下,more 不顯示控制符,本選項使more 顯示控制符,
          例如,將 (CTRL C) 顯示成 ^ C
          -s 將多個空行轉換成一個空行顯示
          -u 禁止產生下劃線序列
          -w 一般情況下 more 顯示完后立即推出,本選項在顯示完后作提
          示,敲任意鍵后推出
          -n 行數 指定每屏顯示的行數
          + 行號 從指定行號開始顯示
          +/模式 在文件中搜索指定模式,從模式出現行的上兩行開始顯示 文件未顯示完時,可以使用more 命令中的子命令,命令中除了! 和 / 以外均不回顯,也不用敲回車,當命令破壞 more 提示行時,可用退格鍵恢復提示行。在以下子命令操作中,i 表示數字,缺省值為 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 從當前行開始編輯當前文件編輯器由環境變量
          $EDITOR定義
          h 顯示幫助信息
          i / 模式 向前搜索,直至模式的第 i 次出現 , 從該行的上 兩行開始顯示一屏
          in 向前搜索,直至上一模式的第 i 次出現 , 從該行 的上兩行開始顯示一屏
          單引號 回到上次搜索的出發點,若無搜索則回到開始位置
          ! 命令 激活一個sh 去執行指定的命令
          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 ...)拷貝到目標上,目標不能與文件同名, 若目標是文件名,則拷貝的文件只能有一個,若目標是目錄, 則拷貝的文件可以有多個,若目標文件不存在,則建立這個文件,若存在,則覆蓋其以前的內容,若目標是目錄,則將文件拷貝到這個目錄下。
          - i 在覆蓋已存在文件時作提示,若回答 y 則覆蓋,其他則中止
          - p 不僅拷貝文件內容,還有修改時間,存取模式,存取控制表, 但不拷貝
          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] 文件...
          [說明]: 改變文件的存取模式,存取模式可表示為數字或符號串,例如:
          chmod nnnn file , n為0-7的數字,意義如下:
          4000 運行時可改變UID
          2000 運行時可改變GID
          1000 置粘著位
          0400 文件主可讀
          0200 文件主可寫
          0100 文件主可執行
          0040 同組用戶可讀
          0020 同組用戶可寫
          0010 同組用戶可執行
          0004 其他用戶可讀
          0002 其他用戶可寫
          0001 其他用戶可執行
          nnnn 就是上列數字相加得到的,例如 chmod 0777 file 是指將文件 file 存取權限置為所有用戶可讀可寫可執行。
          -R 遞歸地改變所有子目錄下所有文件的存取模式
          u 文件主
          g 同組用戶
          o 其他用戶
          a 所有用戶
          + 增加后列權限
          - 取消后列權限
          = 置成后列權限
          r 可讀
          w 可寫
          x 可執行
          s 運行時可置UID
          t 運行時可置GID
          [例子]:
          chmod 0666 file1 file2 將文件 file1 及 file2 置為所有用戶可讀可寫
          chmod u+x file 對文件 file 增加文件主可執行權限
          chmod o-rwx 對文件file 取消其他用戶的所有權限

          1.13 chown

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

          1.14 chgrp

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

          1.15 cmp

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

          1.16 diff

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

          1.17 wc

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

          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]] 文件...
          [說明]: 將指定文件的訪問時間和修改時間改變,若指定文件不存在則創建之,若無指定時間,則使用當前時間,返回值是未成功改變時間的文件個數,包括不存在而又未能創建的文件。
          -a 只改變訪問時間
          -m 只改變修改時間
          -c 若文件不存在,不創建它且不作提示
          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 將指定文件轉儲為壓縮格式,文件名后加 .z , 文件存取模式,訪問時間,修改時間等均不變
          [例子]:
          pack largefile 將largefile 壓縮后轉儲為largefile.z

          1.22 pcat 顯示壓縮文件

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

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

          1.23 unpack

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

          1.24 find

          [語法]: find 路徑名... 表達式
          [說明]: find 命令遞歸地遍歷指定路徑下的每個文件和子目錄,看該文件是否能使表達式值為真,以下 n 代表一個十進制整數,+n 代表打印 n , -n 代表小于 n ,下面是合法表達式說明:
          -name 模式 文件名與模式匹配則為真,(\ 為轉意符)
          -perm [-]八進制數 文件存取模式與八進制數相同則為真若有- 選項,則文件存
          取模式含有八進制數規定模式即為真
          -size n[c] 文件塊長度為 n 則真(一塊為512字節),若
          有c 選項,則文件字節長度為 n 則真
          -atime n 若文件的最近訪問時間為 n 天前則為真,
          find 命令將改變其訪問的目錄的訪問時間
          -mtime n 若文件的最近修改時間為 n 天前則為真
          -ctime n 若文件狀態為 n 天前改變則為真
          -exec 命令 { }\; 若命令返回值為0則真,{ }內為命令參數,
          此命令必須以 \; 為結束
          -ok 命令 { }\; 與 exec 相同,只是在命令執行前先提示,若
          回答 y 則執行命令
          -print 顯示輸出使表達式為真的文件名
          -newer 文件 若文件的訪問時間比newer 指定的文件新則真
          -depth 先下降到搜索目錄的子目錄,然后才至其自身
          -mount 僅查找包含指定目錄的文件系統
          -local 文件在當前文件系統時為真
          -type c 文件類型為 c 則真,c 取值可為 b(塊文件) c (字符文件)
          d(目錄) l (符號鏈接) p (命名管道) f (普通文件)
          \( 表達式 \) 表達式為真則真
          -links n 文件鏈接數為 n 時為真
          -user 用戶 當文件屬于用戶時為真,用戶可用數字表示UID
          -nouser 當文件不屬于 /etc/passwd 中的一個用戶時為真
          -group 文件組 當文件屬于文件組時為真,文件組可用數字表示GID
          -nogroup 當文件不屬于 /etc/group 中的一個組時為真
          -fstype 類型 當文件所屬文件系統類型為指定類型時真
          -inum n 當文件 i 節點號為 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 [選項] 模式 [文件...]
          [說明]: 在指定的文件中搜索模式,并顯示所有包含模式的行,模式是一個正規表達式,在使用正規表達式時,最好將其引在單引號(') 中,若指定文件為缺省,則使用標準輸入,正規表達式可以是:
          . 匹配任意一個字符
          * 匹配0個或多個*前的字符
          ^ 匹配行開頭
          $ 匹配行結尾
          [] 匹配[ ]中的任意一個字符,[]中可用 - 表示范圍,
          例如[a-z]表示字母a 至z 中的任意一個
          \ 轉意字符
          命令中的選項為:
          -b 顯示塊號
          -c 僅顯示各指定文件中包含模式的總行數
          -i 模式中字母不區分大小寫
          -h 不將包含模式的文件名顯示在該行上
          -l 僅顯示包含模式的文件名
          -n 顯示模式所在行的行號
          -s 指定文件若不存在或不可讀,不提示錯誤信息
          -v 顯示所有不包含模式的行
          [例子]:
          grep 'good' * 在所有文件中搜索含有字符串 good 的行
          grep '^myline' mytext 在文件mytext中搜索行首出現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方式,在屏幕底部出現提示符 : ,此時可使用任意ex命令,屏幕底行也用來作/ ? ! 命令的提示行,大多數命令可以在其前面加數字,表示命令執行的重復次數,下面簡單介紹一下vi 的命令集,^ 表示(CTRL)鍵
          ^B 退回前一頁,前面加數字表示重復次數,每次換頁時
          保留上一頁的兩行
          ^D 在命令模式下,表示下滾屏幕的一半,在輸入模式下,表示回退至
          左邊的自動縮進處
          ^E 顯示屏幕底線之下的一行
          ^F 前進一頁,前面加數字表示重復次數,每次換頁時
          保留上一頁的兩行
          ^G 顯示當前文件名,當前行號和文件總行數,并用百分號當前行在
          整個文件中的位置
          ^H(退格) 在命令模式下,光標左移一格;在輸入模式下,刪去前面的字符
          ^I(TAB) 在輸入模式下,產生一串空格
          ^J(LF) 光標下移一行
          ^L 刷新屏幕,即將屏幕重新顯示
          ^M(回車) 在命令模式下,光標移動至下行開頭
          在輸入模式下,開辟一新行
          ^N 光標下移一行
          ^P 光標上移一行
          ^Q 在輸入模式下,將其后的非打印字符作為正文插入
          ^R 刷新屏幕
          ^U 屏幕上滾一半,前面加數字時表示上滾的行數,此數字對
          以后的^D ^U 命令有效
          ^V 在輸入模式下,將其后的非打印字符作為正文插入
          ^W 在輸入模式下,使光標回退一個字
          ^Y 顯示屏幕底線之上的一行
          ^Z 暫停編輯,退回上層Shell
          ^[(ESC) 退出輸入模式,回到命令模式
          ! 暫時退出編輯,執行Shell命令
          (雙引號) 用于標志有名緩沖區,編號緩沖區1-9用于保存被刪去的正文,字
          母名緩沖區a-z供用戶存放自定義的正文
          $ 將光標移動到當前行尾,前加數字則表示前移行數,如2$表示移動
          到下一行行尾
          % 將光標移動到配對的小括號()或大括號{}上去
          ( 退回句子開頭
          ) 前移到句子開頭
          - 退到上一行第一個非空格字符
          . 重復上一次改變緩沖區內容的命令
          / 模式 向前搜索模式,將光標移動到模式出現處,模式是一個正規
          表達式,(參看 grep)
          : 在屏幕底部提示:,其后可使用ex命令
          ? 功能同 / ,但方向是向前查找
          [[ 光標回退至前一節分界處
          \ 轉意符
          ]] 光標前移至節分界處
          ^(不是CTRL) 光標移至當前行第一個非空字符上
          ' 連續兩個''表示將光標移至其移動前的位置,'后跟字母表示光標字
          母標記的行首(參看 m 命令)
          A 在行尾插入正文,進入輸入模式
          B 光標回退一個字
          C 替換光標后的內容
          D 刪除光標后的內容
          E 光標前移到字尾
          F 字符 在當前行向左查找指定字符
          G 光標移動到其前面數字指定的行,若未指定則移動到最后一行
          H 光標移動到屏幕頂行,若前面有數字,則移動到屏幕上該數字
          指定的行
          I 在行開頭插入正文
          J 連接兩行,若前面有數字則連接數字指定的行
          L 光標移動到屏幕底行,若前面有數字,則移動到屏幕底線往上數該
          數字指定的行
          M 光標移動到屏幕中線
          N 使用模式查找/或?時,重復找下一個匹配的模式,但方向與上次相
          反,其功能同 n ,但方向相反
          O 在當前行上開辟一新行
          P 將上次被刪除的正文插入光標前面,可在其前面加緩沖區編號,編
          號1-9用于保存被刪去的正文,字母名緩沖區a-z供用戶存放自定
          義的正文
          Q 從vi 推出進入ex命令狀態
          R 替換字符串
          S 替換整行
          T 字符 向左查找字符
          U 將當前行恢復至第一次修改前的狀態
          W 光標移至下一個字首
          X 刪除光標前的字符
          Y 將當前行存入無名緩沖區,前面加數字表示存入的行數,也可用有
          名緩沖區來保存,以后可用命令p或P將其取出
          ZZ 存盤退出vi
          a 光標后插入正文
          b 光標回退至上一個字首
          cw 替換當前字
          c) 替換當前句子
          dw 刪除一個字
          dd 刪除一行
          e 光標移到下一個字末
          f 字符 在當前行向前查找字符
          h 光標左移一格
          i 在光標前插入正文
          j 光標下移一行
          k 光標上移一行
          l 光標右移一格
          m 字母 用字母標記當前行,以后可用 '字母使光標移動到當前行,
          (參看'命令)
          n 重復上次 / 或 ? 命令
          o 在當前行下開辟一新行
          p 將用戶緩沖區內容放到光標位置(參看P命令)
          r 替換當前字符
          s 用一串字符替換當前字符
          t 字符 光標移動至字符前
          u 取消上次操作
          w 光標移至下一字首
          x 刪除當前字符
          yw 將當前字存入無名緩沖區,前面可加x,表示存入名字為x的有名
          緩沖區(x為a-z),也可加數字表示存入的字數,以后可用P或p命
          令取出
          yy 將當前行存入無名緩沖區,用法參看yw
          { 光標移動至前一段開頭
          | 光標移至行首,若前面加數字,則移到數字指定行的行首
          } 光標移至下一段開頭
          在:提示符下,常用命令如下:
          :w 當前文件存盤
          :w! 強制存盤
          :w 文件 將內容寫入指定文件
          :w! 文件 強制寫入指定文件
          :x,y w 文件 將 x至 y 行寫入指定文件中
          :r 文件 將文件讀到光標位置
          :r ! 命令 將系統命令的輸出讀到光標位置
          :q 退出編輯
          :q! 強制退出
          :x 與命令ZZ相同
          :e 文件名 編輯另一文件
          :e ! 重新編輯文件,放棄任何改變
          :sh 執行sh,結束后回到編輯
          :! 命令 執行命令后回到編輯
          :n 編輯下一文件
          :n 文件表 重新定義待編輯文件表
          :set 設置 vi 的選項,例如 set nu 表示每行前顯示行號,在選項前
          加no則表示清除該選項,例如 set nonu 表示每行前不顯示行
          號,下面是一些常用的選項:
          ai 自動縮進
          aw 編輯下一文件前自動存盤
          ic 查找字符串時不區分大小寫
          nu 每行前顯示行號
          sm 輸入)及}時顯示與之配對的( 或 {
          slow 插入時延遲屏幕刷新
          ws 使查找能繞過文件尾從頭進行
          wa 寫文件之前不作對文件的檢查

          第二章 設備管理

          2.1 stty
          [語法]: stty [-a] [-g] [選項]
          [說明]: 本命令設置終端,無參數時報告終端設置,本命令功能十分強大,應謹慎使用,下面僅介紹部分常用功能
          -a 顯示當前終端所有設置
          -g 以能作為 stty 命令參數的方式顯示終端設置
          以下是終端常用設置,在設置前加-表示清除設置:
          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) 將換行轉換(不轉換)成回車
          icrnl( -icrnl) 將回車轉換(不轉換)成換行
          igncr(-ignrc) 忽略(不忽略)回車
          iuclc( -iuclc) 將大寫字母轉換(不轉換)成小寫字母
          3.輸出方式
          olcut(-olcut) 將小寫字母轉換(不轉換)為大寫字母
          onlcr(-onlcr) 輸出時將換行符轉換(不轉換)為回車換行
          ocrnl(-ocrnl) 輸出時將回車符轉換(不轉換)為換行符
          4.本地方式
          echo (-echo) 設置(清除)回顯
          stwrap(-stwrap) 截斷(不截斷)大于79個字符的行
          echoctl(-echoctr) 將控制鍵回顯為^
          2.2 tty

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

          2.3 lp

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

          2.4 lpstat

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

          2.5 cancel

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

          2.6 enable

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

          2.7 disable

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

          2.8 sync

          [語法]: sync
          [說明]: 將磁盤緩沖區內容寫回磁盤
          2.9 mount

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

          2.10 umount

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

          2.11 tar

          [語法]: tar -c[vwfbL] [設備] [塊] 文件...
          tar -r[vwfbL] [設備] [塊] 文件...
          tar -t[vfL] [設備] [文件...]
          tar -u[vwfbL] [設備] [塊] 文件...
          tar -x[lmovwfL] [設備] [文件...]
          [說明]: 將多個文件歸檔,命令中各參數的意義為:
          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] [文件系統]
          [說明]: 顯示剩余 i 節點和塊數,使用 -t 選項,還顯示總塊數和 i 節點數
          [例子]: df -t

          2.13 du

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

          第三章 進程管理

          3.1 sleep

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

          3.2 ps

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

          3.3 at

          [語法]: at [-f 命令文件] [-m] [-q 隊列] -t 時間
          [說明]: at命令由cron管理,在未來一個指定的時間內執行一組命令,命令可以從指定文件讀入,也可從鍵盤讀入,從鍵盤讀入時以EOF結束,(通常為CTRL D)
          -f 從指定命令文件中讀入命令
          -m 命令執行完后給用戶發郵件
          -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 不合法內存段
          12 錯誤的系統調用參數
          13 寫入不可讀的連通管道
          14 alarm clock
          15 軟件結束信號
          16 用戶定義信號一
          17 用戶定義信號二
          [例子]:
          kill -9 444 殺死進程號為 444 的進程

          第四章 系統管理和用戶管理

          4.1 who

          [語法]: who
          who am i
          [說明]: 列出現在系統中的用戶,who am i 顯示自己

          4.2 whodo

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

          4.3 passwd

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

          4.4 logname

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

          4.5 su

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

          4.6 time

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

          4.7 date

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

          4.8 shutdown

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

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

          4.9 fsck

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

          第五章 通信和郵件

          5.1 wall

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

          5.2 mesg

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

          5.3 write

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

          5.4 mailx

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

          第六章 Shell 編程

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

          第七章 數學計算命令

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

          附錄 UNIX 常用命令簡單說明

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

          命令 功能簡述

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

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

          Unix命令大全

          1.登錄工作站
          1.1 透過 PC 登錄工作站
          執行格式:telnet hostname (在 dos 下執行)
          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 > 執行后將會出現下列信息
          Changing NIS password for user on ice.
          Old password: ______ > 輸入舊密碼
          New password: ______ > 輸入新密碼(最好6-8字,英文字母與數字混合)
          Retype new password: ______ > 再輸入一次密碼

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

          Example: % man ls

          1.6 進入遠端電腦系統
          執行格式:rlogin hostname [-1 username]
          Example:

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

          執行格式:telnet hostname 或 telnet IP address
          Example:

          %telnet doc or %telnet 140.109.20.251

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

          Example :

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

          "*" 結尾表示為執行檔,"@" 結尾表示為 symblic link。

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

          2.2 目錄之縮寫:

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

          2.3 改變工作目錄位置
          執行格式: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 復制文件
          執行格式: cp [-r] source destination

          Example:

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

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

          2.5 移動或更改文件、目錄名稱
          執行格式: 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 建立新目錄
          執行格式: mkdir directory-name

          Exmaple :

          mkdir dir1 建立一新目錄 dir1。

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

          Example :

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

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

          Example :

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

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

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

          2.11 查看文件內容
          執行格式: cat filename
          Example :

          cat file1 以連續顯示方式,查看文件名 file1 之內容。

          執行格式: more filename 或 cat filename | more
          Example :

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

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

          du dir1 顯示目錄 dir1 的總容量及其次目錄的容量(以 k byte 為容量)。
          du -s dir1 顯示目錄 dir1 的總容量。

          2.13 查看自己的 disk quota 使用狀況
          disk quota : 工作站磁盤空間的使用限額。
          執行格式: 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 時,雖然可以繼續使用,但是必須七天之內降到 quota 以下,否則即使用量沒有超 limit(最高限額),也無法再寫入或復制任何文件。
          limit : 最高使用額度。當你的 usage 達到 limit 時,無法再寫入或復制任何文件。

          3. 文件傳輸
          3.1 拷貝文件或目錄至遠端工作站
          執行格式: 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 自遠端工作站,拷貝文件或目錄
          執行格式: 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 本地工作站與遠端工作站之間文件傳輸
          ( 必須擁有遠端工作站之帳號及密碼,才可進行傳輸工作 )
          執行格式: 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 結束 ftp 工作。
          ftp> bye 結束 ftp 工作。

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

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

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

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

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

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

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

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

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

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

          ln file1 file2   將名稱 file2,連結至文件 file1。

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

          ln -s file3 file4 將名稱 file4,連結至文件file3。

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

          grep abc file1

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

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

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

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

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

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

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

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

          4.12 troff 文件之打印
          執行格式: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 檢查打印機狀態,及打印工作順序編號和使用者名稱
          執行格式:lpq [-Pprinter -name]

          %lpq 或 lpq -Psp1
          檢查 sp1 打印機之狀態。

          5.2 刪除打印機內之打印工作 (使用者僅可刪除自己的打印工作 )
          執行格式: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。

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

          6.1 查看系統之 process
          執行格式:ps [-aux]
          Example:

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

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

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

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

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

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

          6.4 查看正在 background 中執行的 process
          執行格式:jobs

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

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

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

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

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

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

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

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

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

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

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

          Example:

          %set history 40

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

          10.2查看命令記錄表之內容
          執行格式: history

          10.3 使用命令記錄表
          執行格式: !!

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

          10.4 顯示前一個命令之內容
          執行格式: !!:p

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

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

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

          11.2 解壓縮還原資料

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

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

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

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

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

          14. 查看系統中的使用者
          執行格式: who 或 finger
          執行格式: w
          執行格式: finger username or finger username@domainname

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

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

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

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

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

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

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

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

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

          20.5 讀取信件
          執行格式: 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) 是在工作站上被廣大使用的中英文編輯軟體。對初學者而言,常因其特殊的使用方法,而不得其門而入;對已經在使用 vi 的使用者來說,也常見因對 vi 的不熟悉或不夠了解,而無法發揮出 vi 強大的編輯能力,以下將介紹 vi 之使用方法簡介。

          21.1本文內容大綱
          進入 vi

          離開 vi

          輸入模式

          如何進入輸入模式

          如何離開輸入模式

          指令模式

          光標的移動

          視窗的移動

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

          刪除與修改(delete、replace)

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

          指令重復

          取消前一動作(undo)

          字串搜尋

          資料的連接與分行

          環境的設定

          ex 指令

          其它方面

          中文編輯

          恢復編輯時被中斷的文件

          編輯多個文件

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

          21.2 進入vi
          直接執行 vi編輯程序即可:

          %vi test

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

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

          -- 作者:itvue
          -- 發布時間:2005-5-11 10:17:42

          --

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

          離開vi。

          :q! 離開vi,并放棄剛在緩沖區內編輯的內容。

          :wq 將緩沖區內的資料寫入磁盤中,并離開vi。

          :ZZ 同wq。

          :x 同wq。

          :w 將緩沖區內的資料寫入磁盤中,但并不離開vi。

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

          此指令可與: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》 結束輸入模式。

          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中是指以『!』、『.』或『?』結束的一串字。

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

          21.7 視窗的移動

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

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

          Operator + Scope command

          (運算子) (范圍)

          運算子:

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

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

          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 修改整行的內容。

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

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

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

          l dd 刪除光標所在該行。

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

          l R 進入取代狀態,直到《ESC》為止。

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

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

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

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

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

          例:

          移動一行 .在該行執行 dd

          .光標移至目的地

          .執行 p

          復制一行 .在該行執行 yy

          .光標移至目的地

          .執行 p

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

          例:

          刪除10行 .10dd

          復制10行 .10yy

          指標往下移10行 .10j

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

          u 恢復最后一個指令之前的結果。

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

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

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

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

          n 往下繼續尋找下一個相同的字串。

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

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

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

          21.15 環境的設定
          :set nu 設定資料的行號。

          :set nonu 取消行號設定。

          :set ai 自動內縮。

          :set noai 取消自動內縮。

          自動內縮(automatic indentation)

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

          .vi test

          .(進入編輯視窗后)

          this is the test for auto indent

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

          《Tab》data

          《Tab》data

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

          the end of auto indent.

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

          21.16 ex指令
          讀寫資料

          :w 將緩沖區的資料寫入磁盤中。

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

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

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

          刪除、復制及移動

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

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

          :%d 刪除整個編輯緩沖區。

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

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

          字串搜尋與取代

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

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

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

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

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

          21.17 恢復編輯時被中斷的文件
          在編輯過程中,若系統當掉或連線中斷,而緩沖區的資料并還未被寫回磁盤時,當再度回到系統,執行下列指令即可回復中斷前的文件內容。

          %vi -r filename

          21.18 編輯多個文件

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

          %vi file1 file2 ...

          當第一個文件編修完成后,可利用『:w』將該緩沖區存檔,而后再利用 『:n』載入下一個文件。

          posted @ 2008-06-13 23:13 xzc 閱讀(440) | 評論 (0)編輯 收藏
          僅列出標題
          共32頁: First 上一頁 17 18 19 20 21 22 23 24 25 下一頁 Last 
          主站蜘蛛池模板: 景泰县| 广平县| 蒙城县| 裕民县| 长白| 岱山县| 都兰县| 吉林市| 申扎县| 天祝| 蚌埠市| 蛟河市| 南京市| 眉山市| 儋州市| 鹤山市| 万盛区| 彭州市| 中牟县| 鄄城县| 长宁县| 汽车| 仁怀市| 都江堰市| 翁源县| 固安县| 桃园县| 电白县| 苍山县| 哈巴河县| 黎平县| 阿巴嘎旗| 城步| 阜宁县| 宣威市| 桐城市| 郁南县| 霍州市| 湖南省| 红河县| 千阳县|