shellscript로 kube-ps1 토글 기능 구현하는 방법에 대해 알아본다.


Index

  1. Intro
  2. 구현하기

Intro

[General] DevOps Engineer에 최적화된 맥 설정하기 에서 지금 사용중인 쿠버네티스 클러스터와 네임스페이스를 터미널 Prompt에 보여주는 kube-ps1을 설치했다. 편리한 툴이지만 매번 클러스터 정보를 불러와야 해서 그런지 원격 클러스터에 접속했을 때 터미널이 너무 느려졌다. 그래서 쿠버네티스 작업을 할 때는 해당 기능을 키고, 아닐 때는 끌 수 있는 기능을 shellscript로 구현했다.


구현하기

[Picture 1] 토글 기능

본 문서를 끝까지 따라하면 위의 gif처럼 필요에 따라 kube-ps1 을 키고 끄는 기능을 사용할 수 있다.


shellscript 작성

kube.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash

ZSHRC_FILE="$HOME/.zshrc"
KUBE_PS1_COMMAND='source "$(brew --prefix)/opt/kube-ps1/share/kube-ps1.sh"'
PS1_COMMAND='PS1='"'"'$(kube_ps1)'"'"'$PS1'

remove_lines() {
    sed -i '' "/$(echo "$KUBE_PS1_COMMAND" | sed 's/\//\\\//g')/d" "$ZSHRC_FILE"
    sed -i '' "/$(echo "$PS1_COMMAND" | sed 's/\//\\\//g')/d" "$ZSHRC_FILE"
}

add_lines() {
    echo "$KUBE_PS1_COMMAND" >> "$ZSHRC_FILE"
    echo "$PS1_COMMAND" >> "$ZSHRC_FILE"
}

main() {
    if grep -q "$(echo "$KUBE_PS1_COMMAND" | sed 's/\//\\\//g')" "$ZSHRC_FILE" && grep -q "$(echo "$PS1_COMMAND" | sed 's/\//\\\//g')" "$ZSHRC_FILE"; then
        echo "Lines already exist. Removing them."
        remove_lines
    else
        echo "Lines do not exist. Adding them."
        add_lines
    fi

}

main

상세

1
2
source "$(brew --prefix)/opt/kube-ps1/share/kube-ps1.sh"
PS1='$(kube_ps1)'$PS1

kube-ps1을 사용하려면 .zshrc에 위의 두 줄을 추가해야 한다. 내가 작성한 쉘스크립트는 .zshrc에 두 줄이 이미 있으면 삭제해서 kube-ps1 기능을 off하고, 없으면 추가해서 기능을 on 한다. 그런데 처음에는 PS1='$(kube_ps1)'$PS1 를 그대로 쉘스크립트에 넣었더니 변수로 kube_ps1이 변수로 인식이 되어서 ./kube.sh: line 5: kube_ps1: command not found 오류가 났다.

스택오버플로우를 찾아보다가 How to escape single quotes within single quoted strings 에 나와있는 방식대로 '"'"' 를 사용해서 문제를 해결했다.


alias 등록

.zshrc

1
2
# kube prompt turn off/on
alias kube="./kube.sh && source ~/.zshrc"

기호에 맞는 alias로 등록해서 사용하면 된다!