cat命令及重定向輸入輸出命令
在linux系統的shell腳本編程中,有些時候我們需要在腳本程序的執行過程中輸出一些文件,這些文件可能是一個簡單的文本文檔、對腳本執行過程中產生的一些數據的記錄或者根據需要建立輸出一個新的腳本到系統中等等。對於這樣的情況我們可以采用cat和重定向輸入輸出命令集合來進行解決,下面就此做一個簡單的介紹。
一、cat命令
cat命令是linux一個用於查看文件內容的命令,該命令會將輸入的內容輸。一般情況下這里的輸入會是一個跟着cat后面的參數,而輸出這是控制台。所以該命令最簡單的作用就是將一個文件的內容顯示到控制台,以便我們查看其中的內容。
但是正如上面提到的只是一般情況一樣,那就有特殊的情況。當我們在使用cat命令時如果后面沒有添加任何參數,那么此時cat的輸入就是控制台而輸出也是控制台,並且此時沒輸入一行就會顯示一行,在這種情況下我們如果要終止輸入則需要借助ctr+d快捷鍵結束輸入或者ctr+c快捷鍵向程序發出信號SIGINT終止該進程。
注:如果ctrl+d時當前行沒有輸入字符, bash把它當作EOF字符, 結束/退出.如果ctrl+d時當前行有輸入, 刪除光標后的字符. 這是readline的特性, 不發送信號. 具體可通過命令man bash 或man readline進行查閱。
二、重定向輸入輸出命令“>”、“>>”、“<”、“<<”
兩個重定向輸入命令有“<”和“<<”,這兩個命令都是用於將輸入進行重定向的:
命令“<”的使用為“[n]< word”,在bash手冊中的解釋為將以“word”擴展開來的文件打開,作為文件描述符n的輸入,如果沒給出文件描述符n,那么n將默認為0即標准輸入。
命令“<<”的使用為“<< [ - ] word”,該命令不會對word進行任何擴展,它的作用是將當前源作為shell的輸入直到遇到一個只存在結束符的行。其中結束符是由word指明的,其規則為將word中的字符去掉被引號“”引起來的內容剩余的。通常即word本身。另外其中的可選項[-]如果給出的話,那么輸入中的每行開頭的制表符將被濾除。
兩個重定向輸出命令“>”、“>>”,這兩個命令均用於進行重定向輸出的。我們先來看“>”命令,該命令的使用為“[n]>word”,首先n依然是要輸出的文件描述符,如果沒有給出那么將默認為標准輸出,而word則會擴展為需要輸出到的文件。對於該命令如果shell已將noclobber選項設置,那么當輸出時如果目標文件已存在則bash會報錯“文件已存在”。反之則不會報錯但是卻會把原有文件中的內容全部覆蓋掉。Noclobber選項設置后會不允許文件的覆蓋,經通過“set -o noclobber”命令允許,關閉可以使用“set +o noclobber ”。
另外一個重定向輸出命令“>>”的使用方法為“[n]>>word”,該命令中的參數的意思和上面幾個的一樣,都是文件描述符以及目標文件。該命令和上一個重定向輸出命令的不同點之一在於該輸出並不會覆蓋原有的文件而是附加在原有文件的后面。並且當輸出的目標文件不存在時也會自動的創建。
以上是關於四個重定向輸入輸出命令的簡要描述,如果想要獲得更詳細的講解可通過“man bash”命令查看bash手冊中關於重定向一節。
三、常見的使用例子
通過上面的介紹,現在我們對於cat命令及重定向命令已經都有了一個簡單的了解,接下來就看幾個常用的使用例子來初步認識一下:
1、命令cat > test.sh,該命令將標准輸入作為輸入然后將輸出重定向到test.sh如果該文件已經存在則將其內容進行覆蓋。
2、組合命令cat << EOF > test.sh,該組合命令使用“<<”將cat命令的輸入重定向到當前輸入源並以一個只存在“EOF”的行作為輸入的結束,然后通過“>”將組合命令“cat << EOF”的輸出重定向到文件test.sh,並且如果文件不存在則創建它,存在則將文件進行覆蓋重寫。
3、組合命令cat << EOF >> test.sh,該命令將組合1的重定向輸出命令換為了“>>”,所以在該命令執行時,如果文件已存在則只是將新內容追加到最后而不會覆蓋原有的內容。
4、組合命令cat > test.sh << EOF,該組合命令的作用和一是相同的,只是這個命令的意思是將cat的輸出重定向到test.sh並且如果存在這覆蓋之,然后將組合命令cat > test.sh的輸入重定向到當前輸入源並以“EOF”作為結束的標志。
5、組合命令cat << HHH > test.sh,該組合命令的意思和作用和組合命令一是完全相同的,所不同的只是將輸入的結束符重“EOF”換成了“HHH”。
四、總結
從上面的學習中可以看出在每一個組合命令中發揮神奇作用並不是cat命令本身,而是緊隨其后的重定向命令。最后要說的是對於上文中提到的“當前輸入源”是指:如果你是在終端輸入命令並執行的,那么這個當前輸入就是終端了,如果你是在寫在腳本里並通過腳本執行的,那么當前輸入源就是你的腳本,這就意味着在腳本里緊隨該命令行之后的內容將作為該命令的輸入直到遇到結束符。這樣我們就可以在腳本中動態的輸出一些內容。方便以后查看。
※關於“>”、“>>”、“<”、“<<”等重定向命令更多的介紹,請查閱bash手冊。
由於本人才疏學淺,如若發現存疑之處,還望各位悉心指出以便糾正。