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

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

我这里有一个 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 脚本,以便我也可以在日志文件中看到此消息。

答案1

“网络无法访问”消息被打印到stderr,而不是stdout,因此您的替换 ( ) 不会捕获它$(ping ...)。您需要在运行时重定向stderr到,而不是在登录时重定向:stdoutping

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

相关内容