bash 출력 구문 분석

bash 출력 구문 분석
#!/bin/bash

start(){
  printf 'Real IP: %s\n' "$(curl -s ifconfig.co)"
  set -- /etc/openvpn/ovpn_tcp/*.nordvpn.com.tcp.ovpn
  shift $(( RANDOM % $# ))
  screen -S vpn -dm openvpn "$1" # connect
  sleep 5 # wait for connection
  printf 'VPN IP: %s\n' "$(curl -s ifconfig.co)"
}
stop(){
  screen -S vpn -X quit
  pkill -f ovpn
}
status(){
  printf 'Current IP: %s\n' "$(curl -s ifconfig.co)"
}

case "$1" in
start)
    if screen -ls | grep -w vpn &> /dev/null; then
      echo "VPN Already Connected";
      status
    else
      start
    fi
    ;;
stop)
    stop
    ;;
*)
    status
    ;;
esac

입력하면 이전 bash스크립트는 다음과 같은 답변을 제공합니다 vpn stop.

vpn stop활성 연결이 있는 경우 다음을 vpn실행합니다.

[root@A ~]# vpn stop
Terminated

vpn stop활성 연결이 없으면 vpn다음을 실행합니다.

[root@A ~]# vpn stop
No screen session found.
Terminated

내가 달성하고 싶은 것은 다음과 같습니다

vpn stop활성 연결이 있는 경우 다음을 vpn실행합니다.

[root@A ~]# vpn stop
VPN Connection Closed Successfully 

vpn stop활성 연결이 없으면 vpn다음을 실행합니다.

[root@A ~]# vpn stop
There's No Active VPN Connection to stop it.

답변1

stop 명령의 종료 신호를 확인해야 합니다.

stop(){
  screen -S vpn -X quit >/dev/null 2>&1
  if [ "$?" == 0 ]; then
    echo "VPN Connection Closed Successfully"
  else
    echo "There's No Active VPN Connection to stop it."
  fi

   pids=( $(pgrep -f ovpn) )
   for pid in "${pids[@]}"; do
    if [[ $pid != $$ ]]; then
     kill "$pid"
  fi
done
}

Bash는 마지막으로 실행된 명령의 종료 신호를 $?변수에 저장합니다. 표준에 따르면 중요한 종료 신호는 모두 0성공으로 간주되고, 그렇지 않으면 실패로 간주됩니다.

편집: 작은 오타를 만들어 리디렉터의 순서를 변경했습니다 >&.

관련 정보