bash隐藏默认的stderr代码并用我自己的代码替换它

时间:2015-11-27 21:01:10

标签: linux bash shell

当我使用ping foo.com时,我得到回复或ping: unknown host foo.com 我正在使用此脚本显示自定义响应

status=$(ping -c 1 foo.com 2> /dev/null)

if [[ status -ne '200' ]]; then
     echo "site found"
    else
     echo "site not found" 
fi

上述问题是,如果找到网站,我会收到site found响应,但如果没有,则会收到错误消息,我会收到默认ping: unknown host foo.com

更新。

declare -A websites 
websites=("" "")
    function ping_sites(){
        if [[ $1 != 'all' ]]; then 
            status=$(curl -I  --stderr /dev/null $1 | head -1 | cut -d' ' -f2)
            result=$(ping -c 1 $1 | grep 'bytes from' | cut -d = -f 4 | awk {'print $1'} 2> /dev/null)

            if [[ status -ne '200' ]]; then
                echo -e "$1  $c_red \t $status FAIL $c_none"
            else
                echo -e "$1  $c_green \t $status OK $c_none"
            fi
        else
          ... 

ping all 
ping foo.com

1 个答案:

答案 0 :(得分:3)

pingWrap(){
  if ping -c 1 "$1" >/dev/null 2>&1; then
    echo "site found"
  else
    echo "site not found" 
  fi
}
pingWrap foo.com
pingWrap localhost

if ping -c 1 "$1" >/dev/null 2>&1; then会抑制所有输出和测试 ping命令的返回状态为0(成功)或其他(失败)。

[[ status -ne '200' ]]接受字符串status和字符串200,将每个字符串转换为整数并测试两个整数的不等式,这听起来是无意义的。

shell命令的返回状态保存在$?变量中,它与HTTP返回码无关。 HTTP运行在TCP之上,而ping甚至不使用TCP。

HTTP状态

如果目标站点已启动并且说HTTP,您可以在stdout上获取http状态:

httpStatus(){ curl -s -w %{http_code} "$@" -o /dev/null; }

如,

httpStatus google.com #200
httpStatus google.com/secret #301

st="`httpStatus "$1"`" &&
case "$st" in
   301) echo Moved permanently;;
   200) echo Success;;
     *) echo Unknown;;
esac