shell學習之(和)差在哪?
嚴格來說,< 符號之前需要指定一個 FD 的(之間不能有空白),
但因為 0 是 < 的預設值,因此 < 與 0< 是一樣的!
> 是定向輸出到檔案,如果檔案不存在,就建立檔案;如果檔案存在,就將其清空;一般我們備份清理記錄檔的時候,就是這種方法:先備份日誌,再用`>`,將記錄檔清空(檔案大小變成0位元組);>>這個是將輸出內容追加到目標檔案中。如果檔案不存在,就建立檔案;如果檔案存在,則將新的內容追加到那個檔案的末尾,該檔案中的原有內容不受影響。
當你搞懂了 0< 原來就是改變 stdin 的資料輸入通道之後,相信要理解如下兩個 redirection
就不難了:
* 1>
* 2>
前者是改變 stdout 的資料輸出通道,後者是改變 stderr 的資料輸出通道。
兩者都是將原本要送出到 monitor 的資料轉向輸出到指定檔案去。
由於 1 是 > 的預設值,因此,1> 與 > 是相同的,都是改 stdout 。
從 file system 的角度來說,單一檔案在單一時間內,只能被單一的 FD 作寫入。
假如 stdout(1) 與 stderr(2) 都同時在寫入 file.both 的話,
則要看它們在寫入時否碰到同時競爭的情形了,基本上是"先搶先贏"的原則。
2>&1 就是將 stderr 並進 stdout 作輸出
* 1>&2 或 >&2 就是將 stdout 並進 stderr 作輸出
在 Linux 檔案系統裡,有個裝置檔位於 /dev/null 。
這個 null 在 I/O Redirection 中可有用得很呢:
* 若將 FD1 跟 FD2 轉到 /dev/null 去,就可將 stdout 與 stderr 弄不見掉。
* 若將 FD0 接到 /dev/null 來,那就是讀進 nothing 。
比方說,當我們在執行一個程式時,畫面會同時送出 stdout 跟 stderr ,
假如你不想看到 stderr (也不想存到檔案去),那可以:
代碼:
$ ls my.file no.such.file 2>/dev/null
my.file
若要相反:只想看到 stderr 呢?還不簡單!將 stdout 弄到 null 就行
為防止重新導向將原有的檔案內容“沖洗”掉,可以選擇>> 追加到檔案末尾。
但是一旦你再次用>重新導向時,還是把所有內容衝掉了。
再此,你可以用以下命令設定是否允許重新導向覆蓋已有檔案
set -o noclobber /*設定禁止重新導向覆蓋*/
set +o noclobber /*設定允許重新導向覆蓋*/
$ cat < file > file 之後原本有內容的檔案結果卻被洗掉了!
要理解這一現像其實不難,這隻是 priority 的問題而已:
* 在 IO Redirection 中,stdout 與 stderr 的管道會先準備好,才會從 stdin 讀進資料。
也就是說,在上例中,> file 會先將 file 清空,然後才讀進 < file ,
但這時候檔案已經被清空了,因此就變成讀不進任何資料了...
在 if 判斷式中,else 部份可以不用,但 then 是必需的。
(若 then 後不想跑任何 command ,可用" : " 這個 null command 代替)。