Bash에서 긴 명령을 조립할 때 사용하는 Tips

Terraform과 Ansible 등을 사용하여 같은 환경을 구축하거나 삭제하거나 변경하거나 여러 번 반복하면서 진행하는 경우가 많습니다. 그러면 명령이 길어질 수 있습니다.

매번 쓰는 것도 번거롭고, 코피페도 똑같이 번거롭다. 터미널에서 나가고 싶지 않습니다.

뭔가 굉장히 만들지 않아도, 스스로 조금 랩 하고 싶을 때에 깔끔하게 만들 수 있고, 또한 개발중 ​​뭔가 편리한 것처럼 간단하고 인터랙티브하게 할 수 있는 Tips입니다.

우선 Bash의 select



우선 Bash의 select입니다.
예를 들어, 다음과 같은 폴더 구조를 가진 리포지토리에서 대화식으로 디렉터리를 인수로 지정하려고 합니다.
services/
├── servcie_A
├── servcie_B
├── servcie_C
├── servcie_D
├── servcie_E
├── servcie_F
└── servcie_G

아래와 같이 select를 활용하면 사용하기 쉽습니다.
SERVICE_DIR=./services
services=$(ls -1 ${DEPLOY_DIR})
echo ""
echo "select deployment:"
select var in $service
do
  if [ "${REPLY}" = "q" ]; then
    echo "QUIT."
    exit -1
  fi

  if [ -n "${var}" ]; then
    break
  else
    echo "invalid selection."
  fi
done
echo $service

숫자로 선택할 수 있는 것이 마음에 듭니다. 입력 실수가 적고 숫자 + Enter로 선택할 수있는이 방법을 좋아합니다. 개인적으로는 옵션이 10개 정도 지금은 이것이 사용하기 쉽습니다.
select deployment:
1) servcie_A  3) servcie_C  5) servcie_E  7) servcie_G
2) servcie_B  4) servcie_D  6) servcie_F
#? 6
servcie_F

선택지 10개 정도라고 썼습니다만, 거기까지 조우하는 일은 없지만, 선택사항이 많아져 버리는 경우가 있습니다.

그렇다면이 방법은 어렵습니다.
select deployment:
 1) servcie_A1  17) servcie_F2  33) servcie_K3  49) servcie_Q1  65) servcie_V2
 2) servcie_A2  18) servcie_F3  34) servcie_L1  50) servcie_Q2  66) servcie_V3
 3) servcie_A3  19) servcie_G1  35) servcie_L2  51) servcie_Q3  67) servcie_W1
 4) servcie_B1  20) servcie_G2  36) servcie_L3  52) servcie_R1  68) servcie_W2
 5) servcie_B2  21) servcie_G3  37) servcie_M1  53) servcie_R2  69) servcie_W3
 6) servcie_B3  22) servcie_H1  38) servcie_M2  54) servcie_R3  70) servcie_X1
 7) servcie_C1  23) servcie_H2  39) servcie_M3  55) servcie_S1  71) servcie_X2
 8) servcie_C2  24) servcie_H3  40) servcie_N1  56) servcie_S2  72) servcie_X3
 9) servcie_C3  25) servcie_I1  41) servcie_N2  57) servcie_S3  73) servcie_Y1
10) servcie_D1  26) servcie_I2  42) servcie_N3  58) servcie_T1  74) servcie_Y2
11) servcie_D2  27) servcie_I3  43) servcie_O1  59) servcie_T2  75) servcie_Y3
12) servcie_D3  28) servcie_J1  44) servcie_O2  60) servcie_T3  76) servcie_Z1
13) servcie_E1  29) servcie_J2  45) servcie_O3  61) servcie_U1  77) servcie_Z2
14) servcie_E2  30) servcie_J3  46) servcie_P1  62) servcie_U2  78) servcie_Z3
15) servcie_E3  31) servcie_K1  47) servcie_P2  63) servcie_U3
16) servcie_F1  32) servcie_K2  48) servcie_P3  64) servcie_V1
#? 

peco의 도움으로



이럴 때, 제 경우에는 오랫동안 신세를 졌습니다 peco

코드는 상당히 간결합니다.

Bash 이외를 사용하게 됩니다만, 1 바이너리 두어 두는 것만으로 움직이는 것이라고 생각하고 있습니다.
PECO_EXE=./peco
SERVICE_DIR=./services
svc=$(ls -1 ${SERVICE_DIR} | ${PECO_EXE})
echo ${svc}

peco를 사용하면 이전과 같은 대량의 선택도,



쿼리에서 쉽게 선택할 수 있습니다.



마지막으로 확인을 넣어



Terraform이나 Ansible의 실행처를 잘못하면, 예를 들면 개발 환경에서 프로덕션에 영향 없어도, 시간도 돈도 걸리므로 마지막에 확인 프롬프트는 넣도록 하고 있습니다.

여기는 select 사용하고 있습니다.
echo ""
echo "Your selection:"
echo "Service-> ${service}"
echo "Variable-> ${var}"
echo "Operation-> ${op}"
select isOk in ok exit
do
  if [ -n "${isOk}" ]; then
    if [ "ok" == "${isOk}" ]; then
      break
    elif [ "exit" == "${isOk}" ]; then
      echo "EXIT!"
      exit -1
    fi
  else
    echo "invalid selection."
  fi
done

이런 느낌입니다. 개발중등은 익숙해지면 잘못 실행해 버리는 일도 있습니다만, 없는 것보다는 몹시라고 생각하고 있습니다.
Your selection:
Service-> servcie_C2
Variable-> myenv.tfvars
Operation-> apply
1) ok
2) exit
#? 

낡은 방법이라고 생각합니다만, 방금의 Tips를 소개할 기회가 있었으므로 써 두었습니다.

좋은 웹페이지 즐겨찾기