yw >outfile 2>&1
$ cat outfile
cat: oyyw: 沒有那個檔案或目錄
和
$ cat oyyw 2>&1 >outfile
cat: oyyw: 沒有那個檔案或目錄
解惑
蒐集了一部分資料以後,解答如下:
順序是很重要的!命令的執行是自左向右的,因此: * 對於第一個命令,shell首先讀到>outfile(等同於1>outfile),此時標準輸出重定向到了檔案outfile,然後shell再讀到2>&1,此時標準錯誤輸出重定向到了標準輸出,也就是重定向到了檔案 outfile,所以得到的結果是 標準輸出和標準錯誤輸出都重定向到了檔案 outfile 中
對於第二個命令,shell首先讀到2>&1,此時標準錯誤輸出重定向到了標準輸出(可能是控制檯),然後shell再讀到>outfile(等同於1>outfile),此時標準輸出重定向到了檔案 outfile,得到的結果是 標準錯誤輸出輸出到了控制檯,標準輸出輸出到檔案 outfile 中
以下這個例子,應該可以很好解答上面的疑問了:
$ cat learn_redirect.sh
#!/bin/bash
foo() {
echo “This is stdout”; # 輸出是標準輸出
echo “This is stderr” 1>&2; # 輸出是標準錯誤輸出
}
foo >errlog 2>&1 >outfile
[pms@jq-hadoop ~/workspace/ouyangyewei/learn_linux] eth0 = xxx
$ sh learn_redirect.sh
[pms@jq-hadoop ~/workspace/ouyangyewei/learn_linux] eth0 = xxx
$ cat outfile
This is stdout
[pms@jq-hadoop ~/workspace/ouyangyewei/learn_linux] eth0 = xxx
$ cat errlog
This is stderr
解釋如下
foo >errlog 2>&1 >outfile 這一句命令,shell執行順序是從左向右。首先shell讀到>errlog,此時標準輸出重定向到了檔案errlog,然後shell讀到2>&1,此時標準錯誤輸出重定向到了標準輸出(等同於標準錯誤輸出重定向到了檔案errlog),然後shell讀到>outfile,此時標準輸出重定向到檔案 outfile,因此,得到的結果是 標準錯誤輸出輸出到檔案 errlog 中,標準輸出輸出到了檔案 outfile 中