의도

의도

의도


저는 작은 쉘 스크립트(POSIX 제외 system_beep())를 작성 중입니다.

Cygwin에서 실행되는 이 스크립트는 어머니의 노트북이 꺼져 있는지 확인하여 명확한 결과를 제공하고 켜져 있으면 경고음을 5번 울립니다.

암호


#!/bin/bash

set -o nounset

blink=$(tput blink)
bold=$(tput bold)
reverse=$(tput rev)
no_color=$(tput sgr0)

red=$(tput setaf 1)
#blue=$(tput setaf 4)
#cyan=$(tput setaf 6)
green=$(tput setaf 2)
#white=$(tput setaf 7)
#yellow=$(tput setaf 3)
#magenta=$(tput setaf 5)

lid_open_color="${blink}${bold}${reverse}${red}"
lid_closed_color="${blink}${bold}${reverse}${green}"

system_beep()
{
    echo -ne '\007'
}

beep_x_times()
{
    i=1; while [ "$i" -le "$1" ]; do

        i=$((i + 1))
        system_beep
        sleep 1s

    done
}

get_lid_state_mom()
{
    if ! ssh heruser@laptop_ip -p port_number -o ConnectTimeout=3 -i /home/myuser/.ssh/id_rsa 2> /dev/null \
        cat /proc/acpi/button/lid/LID0/state | awk '{print $2}'; then

#    if [ "$?" -ne 0 ]; then

        echo "Error connecting to Mom via SSH"
        exit 1

    fi

}

state=$(get_lid_state_mom)



if [ "$state" = "closed" ]; then

    echo "${lid_closed_color}closed${no_color}"

elif [ "$state" = "open" ]; then

    echo "${lid_open_color}open${no_color}"
    beep_x_times 5

else

    echo "Some error occurred!"

fi

질문

노력에도 불구하고 다음과 같은 결과가 나오는 이유를 이해할 수 없는 것 같습니다.

$ ./lid-status-mama-beep
Some error occurred!

올바르게 작동하더라도 SSH를 통해 노트북을 연결할 수 있는 경우:

뚜껑이 닫혀 있는 경우:

$ ./lid-status-mama-beep
closed

뚜껑이 열려 있는 경우:

$ ./lid-status-mama-beep
open

이 오류 처리 사례에서는 분명히 뭔가 잘못된 일을 하고 있습니다.


질문

이 스크립트를 출력하는 방법:

Error connecting to Mom via SSH

어떤 이유로 연결이 끊어지면?

답변1

해결책

각 줄에 대한 설명은 주석을 참조하세요.

get_lid_state_mom()
{
    # I have omitted awk completely here, getting raw value instead
    ssh -p port_number -o ConnectTimeout=3 -i /home/myuser/.ssh/id_rsa heruser@laptop_ip cat /proc/acpi/button/lid/LID0/state 2> /dev/null
}

# this had to be renamed in order for me to know it is a raw value
lid_state_raw=$(get_lid_state_mom)

# indirect test for successful execution seems to be the best method
if [ "$?" -ne 0 ]; then

    echo "Error connecting to Mom via SSH"
    exit 1

fi

# after the success extract the state from the raw value
lid_state=$(echo "$lid_state_raw" | awk '{print $2}')

답변2

이유

if 문이 get_lid_state_mom잘못되었습니다.

second_command아래 코드 조각에서는 종료 값만 고려되는 것을 볼 수 있습니다.

if ! first_command | second_command ; then 
    echo "second_command exited false"
fi

!모든 결과를 반전 first_command | second_command하므로 다음과 같습니다.! second_command

코드에서 Second_command는 에 대한 호출 awk이므로 ifawk가 실패한 경우에만 값이 true입니다.

관련 정보