Bash

重定向到文件無法正常工作

  • April 23, 2015

我這裡有一個 bash 腳本:

#!/bin/bash

TARGET_FILE=ping_result.txt

# declare the target ip addresses
declare -a ips=("XXX.XXX.XXX.XXX" "YYY.YYY.YYY.YYY")

function print_and_log() {
   echo "$1"
   echo "$1" >> $TARGET_FILE 2>&1
}

# loop through all ip addresses
for i in "${ips[@]}"
do
   print_and_log "----- Begin Pinging for $i --- "
   print_and_log "command: ping -c10 $i"
   print_and_log $(ping -c10 $i)
   print_and_log "----- Pinging for $i end ----- "
done

我的目標是將相同的輸出列印到文件和控制台中。但是當我斷開我的作業系統與網路的連接時,在控制台中,我看到(例如第一個 IP 地址):

----- Begin Pinging for XXX.XXX.XXX.XXX --- 
command: ping -c10 XXX.XXX.XXX.XXX
connect: Network is not reachable

----- Pinging for XXX.XXX.XXX.XXX end ----- 

但是在文件中,我沒有看到任何消息,表明網路無法訪問。為什麼?如何更改我的 bash 腳本,我也可以在我的日誌文件中看到此消息。

“網路無法訪問”消息列印到stderr, not stdout,因此您的替換 ( $(ping ...)) 不會擷取它。您需要在執行時重定向stderr到,而不是在登錄時:stdout``ping

   print_and_log "$(ping -c10 "$i" 2>&1)"

引用自:https://unix.stackexchange.com/questions/198184