#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 "TEST1" >&1
echo "TEST2" >&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: