嚴格來說,< 符號之前需要指定乙個 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 代替)。
shell學習之 和 差在哪
嚴格來說,符號之前需要指定乙個 fd 的 之間不能有空白 但因為 0 是 的預設值,因此 與 0 是一樣的 是定向輸出到檔案,如果檔案不存在,就建立檔案 如果檔案存在,就將其清空 一般我們備份清理日誌檔案的時候,就是這種方法 先備份日誌,再用 將日誌檔案清空 檔案大小變成0位元組 這個是將輸出內容追...
shell學習之 與 差在哪
在解答本章題目之前,先讓我們了解乙個概念 return value 我們在 shell 下跑的每乙個 command 或 function 在結束的時候都會傳回父行程乙個值,稱為 return value 在 shell command line 中可用 這個變數得到最 新 的乙個 return v...
SHELL十三問之七 與 差在哪?
先說一下,為何要用 或 好了。qw8l8 m 1 許多時候,我們在 shell 操作上,需要在一定條件下一次執行多個命令,也就是說,要麼不執行,要麼就全執行,而不是每次依序的判斷是否要執行下乙個命令。或是,需要從一些命令執行優先次順中得到豁免,如算術的 2 3 4 那樣.這時候,我們就可引入 命令群...