Linux Bash Shell學習(三):基本I/O操作、特殊字元、修飾鍵和協助

來源:互聯網
上載者:User

  本文也即《Learning the bash Shell》3rd Edition的第一章 bash Basics之讀書筆記之二。但我們將不限於此。用linux就會用bash,一直沒有系統地學過,所以來看看書。

一些I/O操作

  Linux的I/O有兩個特點,一、I/O分為character和block兩類;二、所有的產生和接收資料都可以視為file。而就是說這些I/O操作都可以視為檔案操作。幾個常用的命令包括

cat(copy輸入到輸出)

grep(在輸入中查詢某些字串);

sort(排序);

cut(抽取列);

sed(在輸入中提供edit);

tr(將輸入中的某些字元更換為另外的字元)

  所有的UNIX程式都有標準輸入stdin, stdout和stderr,這些輸入和輸出可以重新向為其他檔案,我們可以通過"<"和">"重新導向他們。這個輸入和輸出的方向已經表示得很清楚了。例如echo "Hello, world!" >temp ,輸出置temp檔案中。如果我們將某個命令的輸出作為另一個命令的輸入,這種結構成為管道(pipe),使用“|”,如果一個命令通過pipe含有兩個或者多個命令,這種命令成為pipeline。例如ls -l | less。下面是一個複雜點的例子:

  

將/etc/passwd中抽取使用者名稱,並按排序顯示出來。我們使用cut命令,cut -d: -f1,表示列是按“:”來分隔,我們需要第一列。在/etc/passwd中第一列就是使用者名稱。命令為:cut -d: -f1 /etc/passwd | sort,如果我們希望將結果列印出來,命令為:cut -d: -f1 /etc/passwd | sort | lp。

前台和後台命令

  如果我們需要命令後台運行,即在運行結束之前,可以在當前的terminal執行其他動作,使用&。一般的命令是前提命令,即命令結束之前不能執行其他命令。後台運行對於我們服務的部署是經常用到的。我們通常在系統啟動後啟動並執行rc.local檔案中加入我們的服務命令:myservice &,這樣在系統啟動後myservice就作為後台作業一直運行。如果一旦作為後台命令,就不能通過stdin獲得輸入,如果命令需要等待使用者敲鍵盤輸入,那就一直在那裡等。如果我們在terminal中啟動了後台命令,但又輸入的時候,會輸出到termial,如果當前我們前台命令也有輸出,就會混在一起,這是見輸出結果重新導向到一個檔案是一個很好選擇。

  一般來講前台和後台命令具有同樣的優先順序別,但是有時當電腦資源緊張的時候,我們可能希望後台命令不要影響前台命令,或者我們的後台服務具有很高的優先順序別,不希望受到印象,可以通過nice命令來設定他們的優先順序別。可以通過man nice來查閱。在cgywin中預設優先順序別為10,數值越大優先順序別越低,nice -n8 command1,將command1的優先基本設定為8。

一些特殊符號

  在shell中有一些特殊的符號,例如 < , > , |, $ , &,* 等等。有時候我們並不需要這些特殊符號作為特殊的用途,而僅僅是一個character,這種場合,使用引號,引號有單引號和雙引號,單引號表示 strong quote,而雙引號表示weak quote,對於雙引號他只能識別出某些特殊符號,這對某些情況是合適的,將在這本書後面的章節中介紹。

  echo 2 * 3 > 5 is a valid inequality,> 5表示將輸出重新導向到名字為5的檔案中,即等同於echo 2 * 3 is a valid inequlity > 5,而*是萬用字元,echo命令並不需要作出選擇或者匹配,我們實驗了一下,在5的檔案中放入了 2 temp 3 is a valid inquality。但是實際上我們是希望在termimal上能輸出 2 * 3 > 5 is a valid inequality,我們需要屏蔽>和*這兩個特殊符號的特殊用途,加引號,例如echo '2 * 3 > 5 is a valid inequality',我們也可以只將包含特殊符號的部位quote來,例如 echo '2 * 3 > 5' is a valid inequality,他們的效果是一樣的。

  如果我們需要屏蔽某一個特殊字元的特殊用法,可以使用反斜線/,例如'*'等同於/*,在上面的例子中我們可以寫為: echo 2 /* 3 /> 5 is a valid inequality,有例如我們希望顯示 '2 * 3 > 5' is a valid inequality,可以寫為echo /'2 /* 3 /> 5/' is a valid inequality。如果先顯示/本身,可以用//。shell是根據順序來進行解析的,我們注意引號嵌套的方式。

  例如echo 'hello/" world',輸出為hello/" world,第一個單引號開始,尋找另一個單引號,中間所有的特殊字元將忽略,包括/符號。例如echo 'hello/' world',第二個引號是中間,因此有了第一串字元hello/,然後又發現了一個',系統將等等下一個',認為命令沒有完,顯示<,提示繼續輸入。

  對於雙引號這個weak quote,情況有些變化,echo "hello// world",顯示hello/ world,而echo 'hello// world'顯示hello// world,又例如echo "hello/" world",顯示hello" world,echo "hello/' world"顯示hello/' world,對於雙引號中/是否有效,其中/"、//、有效,仍將/是為特殊符合,而/'無效,不視為特殊符合。對於這種混亂的情況,沒有必要去記住(估計也容易忘掉),我們只要避免編寫這類的方式就可以了,如果不是需要,不要使用雙引號,或者雙引號之間,避免使用特殊符號,如果有,測試一下就可以了。

  我們可以用/後面按Enter鍵,表示/後面的Enter是個普通的換行,而不是輸入結束。shell使用這種方式來實現多行輸入,換行的時候只要鍵入/就可以了。

一些控制項鍵

  CTRC+某個按鍵具有特殊的控制用途,我一般就只用CTRC-C,也寫為^C。記錄如下。我們也可以用stty -a來查看這些控制。

    CTRL-C:停止當前命令

    CTRL-D:停止input,通常logout

    CTRL-/:在CRTL-C無效的使用,用於停止當前命令,其實使用kill也可以,沒必要記太多

    CTRL-S:停止螢幕輸出

    CTRL-Q:重新輸出螢幕

    CTRL-U:刪除正航命令,一般CTRL-C效果一樣

    CTRL-Z:掛起當前命令,在這本書的第8章詳細描述

協助

  我們通常使用man來進行協助。在bash中,還可以使用help來列出命令,用help <command>來給出具體命令的協助。

 

相關連結:我的Linux操作相關文章

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.