/dev/null &2 和 &1

#ls -al /dev/std*
crw-rw-rw-  1 root  wheel   22,   2 12 19 03:11 /dev/stderr
                                 ^^^
crw-rw-rw-  1 root  wheel   22,   0 12 12 11:01 /dev/stdin
crw-rw-rw-  1 root  wheel   22,   1 12 19 11:37 /dev/stdout
                                 ^^^
&2 and &1 跟這兩個東西有關嗎?

From:FreeBSD轉信版."錯過與等待" <..@.....>
我用兩個例子來簡單說明一下
或許你就可以明白了
你先寫一個 test1.sh 內容如下:
#!/bin/sh
echo &quotTEST1" >&1
echo &quotTEST2" >&2
先用 sh test1.sh 執行看看
再用 sh test1.sh >/dev/null 執行看看
你會發現如果是輸出到 stderr (>&2) 不會因為你使用了 >/dev/null 而隱藏
因為系統原始的設計就是希望錯誤可以讓使用者發現
因此不會因為你重新導向到 >/dev/null 而消失
你先寫一個 test2.sh 內容如下:
#!/bin/sh
telnet badhostname
先用 sh test2.sh 執行看看
再用 sh test2.sh >/dev/null 執行看看
你會發現錯誤訊息都會出現
因為TELNET內部的程式設計就是把訊息送到 >&2
再修改一下成為以下的內容
#!/bin/sh
telnet badhostname 2>&1
再用 sh test2.sh >/dev/null 執行看看
你會發現可以隱藏訊息了
因為 telnet badhostname 2>&1
中的 2>&1 把錯誤訊息 >&2 導向到 >&1 了
而 >&1 會因為你的 >/dev/null 而消失
crontab 中的程式也會像 TELNET 一樣
發生錯誤時是導向到 stderr (>&2)
不會因為你使用了 >/dev/null 而隱藏
因此crontab 執行時都會產生錯誤的輸入而寄出MAIL
要 crontab 安靜
就是要加上 2>&1 才能真的安靜了

Please follow and like us:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *