Bash 스크립트에서 날짜의 Bash 출력

Bash 스크립트에서 날짜의 Bash 출력

나는 다음 스크립트를 작성했습니다.

#!/bin/bash
target="1.1.1.1"
while true;
do
        ping $target -c 1 -v > /dev/null
        if [[ $? -ne 0 ]]; then
                echo "$(date +"%d/%m/%y %R:%S")" >> netStabilityLog
        fi
        sleep 5s
done

한 가지 문제만 제외하면 거의 완벽하게 작동합니다. 출력 파일에서 다음을 netStabilityLog얻습니다.

28/06/22 17:19:26
28/06/22 17:20:06
28/06/22 17:45
28/06/22 18:36:00
28/06/22 18:51

초가 표시되지 않는 경우가 있습니다. 왜 그런 겁니까?

답변1

동시에 실행되는 여러 개의 약간 다른 스크립트 복사본이 있을 수 있으며 각각은 동일한 출력 파일에 기록됩니다. 실행 중인 스크립트 버전 중 하나 이상은 출력에 초를 추가하지 않습니다.

스크립트 자체에 관해서는 외부 유틸리티를 제거 date하고 조건부 출력과 리디렉션을 다르게 수행한다는 제 의견을 말씀드릴 수 있습니다. 또한 누락된 참조를 정렬합니다.

#!/bin/bash

ipaddr=1.1.1.1

while true; do
    if ! ping -c 1 "$ipaddr" >/dev/null 2>&1
    then
        printf '%(%d/%m/%y %T)T\n' -1
    fi
    sleep 5
done >>netStabilityLog

이는 버전 4.2에 도입된 형식 문자열을 사용합니다 %(...)T. 이 매개변수를 사용하면 출력 타임스탬프를 생성할 때 현재 시간이 사용됩니다. 또한 모든 호출에 대해 리디렉션하지 않고 외부 루프에 대해 한 번만 리디렉션합니다.printfbash-1printfprintf

$?이 코드는 pingwith direct 를 사용하여 명시적인 테스트를 제거합니다 if. pingwith (자세한 출력의 경우)는 -v어쨌든 출력을 삭제하기 때문에 호출 되지 않습니다 .

관련 정보