O redirecionamento para o arquivo não funciona corretamente

6

Eu tenho aqui um script 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

Meu objetivo é imprimir a mesma saída em um arquivo e no console. Mas quando eu desconectar o meu sistema operacional da rede, em seguida, no console, vejo (por exemplo, para o primeiro endereço 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 ----- 

Mas no arquivo, não vejo nenhuma mensagem, que a rede não está acessível. Por quê? Como eu posso mudar meu script bash, que eu também posso ver esta mensagem no meu arquivo de registro.

    
por starki 23.04.2015 / 17:41

1 resposta

10

A mensagem "A rede não está acessível" é impressa em stderr , não em stdout , por isso não é capturada pela sua substituição ( $(ping ...) ). Você precisa redirecionar stderr para stdout ao executar ping , não quando você registra:

    print_and_log "$(ping -c10 "$i" 2>&1)"
    
por 23.04.2015 / 18:04