Devbox, Zsh (Fedora)

Install Zsh with Fonts#

Install Fonts#

#!/usr/bin/env bash
set -euo pipefail

# Fedora용 폰트 설치 스크립트
# - MesloLGS NF Regular/Bold
# - D2Coding

FONT_DIR="$HOME/.local/share/fonts"
D2CODING_ZIP_URL="https://github.com/naver/d2codingfont/releases/download/VER1.3.2/D2Coding-Ver1.3.2-20180524.zip"

cleanup() {
    if [ -n "${TEMP_DIR:-}" ] && [ -d "$TEMP_DIR" ]; then
        rm -rf "$TEMP_DIR"
    fi
}
trap cleanup EXIT

echo "🔄 Fedora 패키지 업데이트 및 폰트 설치에 필요한 패키지 설치 중..."
sudo dnf upgrade --refresh -y
sudo dnf install -y curl unzip fontconfig

echo "📂 폰트 디렉터리 준비 중: $FONT_DIR"
mkdir -p "$FONT_DIR"

echo "📂 MesloLGS NF 폰트 설치 중..."
urls=(
    "https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf"
    "https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf"
)

for url in "${urls[@]}"; do
    file="$(basename "$url" | sed 's/%20/ /g')"
    target="$FONT_DIR/$file"

    if [ -f "$target" ]; then
        echo "✅ 이미 설치됨: $file"
    else
        echo "⬇️  다운로드 중: $file"
        curl -fL "$url" -o "$target"
    fi
done

echo "📂 D2Coding 폰트 설치 중..."
D2CODING_FILE="$FONT_DIR/D2Coding-Ver1.3.2-20180524-all.ttc"

if [ -f "$D2CODING_FILE" ]; then
    echo "✅ 이미 설치됨: $(basename "$D2CODING_FILE")"
else
    TEMP_DIR="$(mktemp -d)"
    curl -fL "$D2CODING_ZIP_URL" -o "$TEMP_DIR/d2coding.zip"
    unzip -q "$TEMP_DIR/d2coding.zip" -d "$TEMP_DIR"

    D2CODING_SOURCE="$(find "$TEMP_DIR" -type f -name 'D2Coding-Ver1.3.2-20180524-all.ttc' -print -quit)"

    if [ -z "$D2CODING_SOURCE" ]; then
        echo "❌ D2Coding 폰트 파일을 찾지 못했습니다. zip 파일 구조가 변경되었을 수 있습니다." >&2
        echo "압축 해제 위치: $TEMP_DIR" >&2
        exit 1
    fi

    cp "$D2CODING_SOURCE" "$FONT_DIR/"
fi

echo "🔄 폰트 캐시 갱신 중..."
fc-cache -fv "$FONT_DIR"

echo "-------------------------------------------------------"
echo "✅ 폰트 설치 완료!"
echo "추천 폰트: D2Coding 또는 MesloLGS NF"
echo "터미널/Konsole 설정에서 원하는 폰트로 변경하세요."
echo "-------------------------------------------------------"

Install Zsh#

#!/usr/bin/env bash
set -euo pipefail

# Fedora용 Zsh + Oh My Zsh + Powerlevel10k 설치 스크립트

ZSH_BIN="$(command -v zsh || true)"

echo "🔄 Fedora 패키지 업데이트 및 Zsh 설치에 필요한 패키지 설치 중..."
sudo dnf upgrade --refresh -y
sudo dnf install -y git curl zsh util-linux-user

ZSH_BIN="$(command -v zsh)"

if [ ! -d "$HOME/.oh-my-zsh" ]; then
    echo "📦 Oh My Zsh 설치 중..."
    RUNZSH=no CHSH=no sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
else
    echo "✅ Oh My Zsh가 이미 설치되어 있습니다."
fi

if [ ! -f "$HOME/.zshrc" ]; then
    echo "📝 .zshrc 초기 파일 생성 중..."
    cp "$HOME/.oh-my-zsh/templates/zshrc.zsh-template" "$HOME/.zshrc"
fi

ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
mkdir -p "$ZSH_CUSTOM/themes" "$ZSH_CUSTOM/plugins"

echo "📂 Powerlevel10k 테마 및 Zsh 플러그인 설치 중..."

if [ ! -d "$ZSH_CUSTOM/themes/powerlevel10k" ]; then
    git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "$ZSH_CUSTOM/themes/powerlevel10k"
else
    echo "✅ Powerlevel10k가 이미 설치되어 있습니다."
fi

if [ ! -d "$ZSH_CUSTOM/plugins/zsh-autosuggestions" ]; then
    git clone https://github.com/zsh-users/zsh-autosuggestions "$ZSH_CUSTOM/plugins/zsh-autosuggestions"
else
    echo "✅ zsh-autosuggestions가 이미 설치되어 있습니다."
fi

if [ ! -d "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" ]; then
    git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting"
else
    echo "✅ zsh-syntax-highlighting이 이미 설치되어 있습니다."
fi

echo "📝 .zshrc 설정 업데이트 중..."

if grep -q '^ZSH_THEME=' "$HOME/.zshrc"; then
    sed -i 's|^ZSH_THEME=.*|ZSH_THEME="powerlevel10k/powerlevel10k"|' "$HOME/.zshrc"
else
    echo 'ZSH_THEME="powerlevel10k/powerlevel10k"' >> "$HOME/.zshrc"
fi

if grep -q '^plugins=' "$HOME/.zshrc"; then
    sed -i 's|^plugins=.*|plugins=(git zsh-autosuggestions zsh-syntax-highlighting)|' "$HOME/.zshrc"
else
    echo 'plugins=(git zsh-autosuggestions zsh-syntax-highlighting)' >> "$HOME/.zshrc"
fi

if [ "${SHELL:-}" != "$ZSH_BIN" ]; then
    echo "🐚 기본 쉘을 Zsh로 변경합니다: $ZSH_BIN"
    sudo chsh -s "$ZSH_BIN" "$USER"
else
    echo "✅ 기본 쉘이 이미 Zsh입니다."
fi

echo "-------------------------------------------------------"
echo "✅ Zsh 설치 완료!"
echo "터미널을 재시작하거나 아래 명령어를 실행하세요:"
echo "exec zsh -l"
echo "-------------------------------------------------------"

Install Devbox#

#!/usr/bin/env bash
set -euo pipefail

# Fedora용 Devbox + direnv 설치 스크립트

# 1. 쉘 감지 로직
# 스크립트 자체는 bash로 실행되므로 BASH_VERSION/ZSH_VERSION은 사용하지 않습니다.
# zsh 프롬프트에서 실행한 경우 부모 프로세스가 zsh이므로 부모 쉘을 우선 확인합니다.
PARENT_SHELL="$(ps -p "${PPID:-$$}" -o comm= | sed 's/^-//')"
LOGIN_SHELL="$(basename "${SHELL:-}")"
DETECTED_SHELL="${PARENT_SHELL:-$LOGIN_SHELL}"

case "$DETECTED_SHELL" in
    zsh)
        CURRENT_SHELL="zsh"
        CONF_FILE="$HOME/.zshrc"
        ;;
    bash)
        CURRENT_SHELL="bash"
        CONF_FILE="$HOME/.bashrc"
        ;;
    *)
        case "$LOGIN_SHELL" in
            zsh)
                CURRENT_SHELL="zsh"
                CONF_FILE="$HOME/.zshrc"
                ;;
            bash)
                CURRENT_SHELL="bash"
                CONF_FILE="$HOME/.bashrc"
                ;;
            *)
                echo "⚠️ 지원 여부를 알 수 없는 쉘입니다: ${DETECTED_SHELL:-$LOGIN_SHELL}"
                echo "bash 설정 파일을 사용합니다: $HOME/.bashrc"
                CURRENT_SHELL="bash"
                CONF_FILE="$HOME/.bashrc"
                ;;
        esac
        ;;
esac

echo "🔍 감지된 쉘: $CURRENT_SHELL (설정 파일: $CONF_FILE)"

# 2. 필수 시스템 패키지 업데이트 및 direnv 설치
echo "📦 Fedora 패키지 업데이트 및 direnv 설치 중..."
sudo dnf upgrade --refresh -y
sudo dnf install -y direnv curl git

# 3. Devbox 설치
if ! command -v devbox >/dev/null 2>&1; then
    echo "📦 Devbox 설치를 시작합니다..."
    curl -fsSL https://get.jetpack.io/devbox | bash
else
    echo "✅ Devbox가 이미 설치되어 있습니다."
fi

# 4. 쉘 설정 파일(.zshrc 또는 .bashrc) 업데이트
touch "$CONF_FILE"

echo "📝 $CONF_FILE 설정 업데이트 중..."

# Devbox global shellenv 추가 (중복 체크)
if ! grep -q 'devbox global shellenv' "$CONF_FILE"; then
    {
        echo ''
        echo '# Devbox configuration'
        echo 'eval "$(devbox global shellenv)"'
    } >> "$CONF_FILE"
    echo "✅ Devbox 환경 변수 설정 완료"
else
    echo "✅ Devbox 환경 변수 설정이 이미 존재합니다."
fi

# direnv hook 추가 (중복 체크)
if ! grep -q "direnv hook $CURRENT_SHELL" "$CONF_FILE"; then
    {
        echo ''
        echo '# Direnv configuration'
        echo "eval \"\$(direnv hook $CURRENT_SHELL)\""
    } >> "$CONF_FILE"
    echo "✅ direnv hook 설정 완료"
else
    echo "✅ direnv hook 설정이 이미 존재합니다."
fi

echo "------------------------------------------------"
echo "✨ Devbox 및 direnv 설치와 설정이 완료되었습니다!"
echo "터미널을 재시작하거나 아래 명령어를 입력하세요:"
echo "source $CONF_FILE"
echo "------------------------------------------------"