변수를 null로 설정하지 않고 스크립트 시작 부분에서 오류를 제거하려면 어떻게 해야 합니까?

변수를 null로 설정하지 않고 스크립트 시작 부분에서 오류를 제거하려면 어떻게 해야 합니까?

$alive다음 오류가 표시되도록 허용하면 내 스크립트가 변수를 필수 정수로만 설정하는 문제가 발생했습니다.uptime: /dev/ttys001: No such file or directory

아래 컨텍스트에서 &>/dev/null이후에 명령을 추가하여 제거해 보았습니다.uptime

(( uptime | grep -ohe 'up .*' | sed 's/,//g' | awk '{ print $2 }')&>/dev/null)

또는

( uptime &>/dev/null | grep -ohe 'up .*' | sed 's/,//g' | awk '{ print $2 }')

하지만 이로 인해 다음과 같은 상황이 발생하게 됩니다.

This computer has been awake for  days

그리고 변수를 설정하고 다음과 같이 실행하려면 필요합니다.

This computer has been awake for 32 days

이것은 MacOS에서 bash를 사용한 스크립팅에 대해 배우기 위한 개인적인 프로젝트에 가깝습니다. 따라서 추가적인 통찰력을 주시면 대단히 감사하겠습니다!

이것은 맥락에 따른 스크립트입니다. 컴퓨터에 원격으로 액세스할 수 있도록 무한 루프로 설계되었으며 실행 중인 프로세스를 종료하여 중지할 수 있습니다.

#!/bin/bash

alive=$( uptime | grep -ohe 'up .*' | sed 's/,//g' | awk '{ print $2 }')

until [[ $alive -lt 0 ]]; do
  Caffeinate -d -t 2
  sleep 2
  echo "This computer has been awake for $alive days"
done 

궁극적으로 컴퓨터가 특정 일수에 도달한 다음 중단하고 다시 시작하고 자동으로 로그인한 다음 프로세스를 다시 시작하여 컴퓨터가 몇 달 동안 깨어있어 성능이 저하되지 않도록 하고 싶습니다.

하지만 아직 그럴 시간이 없었어요 ;)

답변1

uptimestderr 출력을 제거해야 합니다 .

alive=$( uptime 2>/dev/null | grep -ohe 'up .*' | sed 's/,//g' | awk '{ print $2 }')

&>/dev/null표준 출력과 표준 오류를 비트버킷으로 리디렉션하면 다음과 같이 됩니다.아니요처리할 출력이며 변수는 빈 문자열로 설정됩니다. 2>/dev/null표준 오류만 리디렉션하여 오류 메시지를 제거하고 일반 출력은 그대로 둡니다.

참고로 모든 작업 awk을 수행할 수 있습니다 . 귀하의 시스템에서 정확한 출력을 알 수는 없지만 제 시스템에서는 다음과 같이 작동합니다.grepseduptime

alive=$(uptime 2>/dev/null | awk '/up/ { print $3 }')

관련 정보