2019/11/26

file descriptor redirection 與 process substitution


是這樣的這邊有個需求想要把 stdout 與 stderr 分別導向至不同的檔案中

這個很簡單

透過 bash 中 > 即可達成

再來 stdout 的 fd 是 1, 而 stderr 的 fd 是 2

組合起來就是

```
command 1> out.log 2> err.log
```

而預設導向的 fd 是 1

於是乎又可以寫成

```
command > out.log 2> err.log
```

接下來變化來了

需求是:
除了把 stdout 與 stderr 分別導向至不同的檔案中, 也要將 stdout 與 stderr 導入至同一個檔案, 並且印出順序要一致

這就會需要用到 process substitution

```
>(list)
# 或
<(list)
```

指令 list 會以非同步方式執行

加上利用 tee 同時導入至檔案與印在螢幕上

組合技如下:

```
command > >(tee stdout.log >> all.log) 2> >(tee stderr.log >> all.log)
```