shell學習之 和 差在哪

2021-06-25 14:08:58 字數 1694 閱讀 2412

嚴格來說,< 符號之前需要指定乙個 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 那樣.這時候,我們就可引入 命令群...