#!/bin/bash set -euo pipefail # -- utils --------------------------------------------------------- prompt_yn() { # usage: prompt_yn "Question (y/N): " N local prompt="${1:-Proceed (y/N): }" local default="${2:-N}" local ans="" if [ -t 0 ] && [ -t 1 ]; then # interactive: read from the TTY (not stdin) read -r -p "$prompt" ans /dev/null; then if prompt_yn "Homebrew not found. Install it now? (y/N): " N; then /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)" else echo "Homebrew is required to install Fish on macOS. Exiting."; exit 1 fi fi elif command -v apt &>/dev/null; then OS="debian"; PKG_MGR="apt" elif command -v dnf &>/dev/null; then OS="rhel"; PKG_MGR="dnf" elif command -v yum &>/dev/null; then OS="rhel"; PKG_MGR="yum" elif command -v pacman &>/dev/null; then OS="arch"; PKG_MGR="pacman" else echo "Unsupported platform."; exit 1 fi } # -- debian repo/key ----------------------------------------------- install_gpg_if_needed() { if [[ "${OS}" == "debian" ]] && ! command -v gpg &>/dev/null; then sudo apt update && sudo apt install -y gnupg fi } add_fish_repo_debian() { echo 'deb http://download.opensuse.org/repositories/shells:/fish:/release:/4/Debian_12/ /' \ | sudo tee /etc/apt/sources.list.d/fish.list >/dev/null curl -fsSL https://download.opensuse.org/repositories/shells:fish:release:4/Debian_12/Release.key \ | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/fish.gpg >/dev/null sudo apt update } # -- install/update fish ------------------------------------------- install_fish() { case "$OS" in debian) add_fish_repo_debian; sudo apt install -y fish ;; rhel) sudo "$PKG_MGR" install -y fish ;; arch) sudo pacman -Sy --noconfirm fish ;; macos) brew install fish ;; esac } update_fish() { case "$PKG_MGR" in apt) sudo apt update if apt list --upgradable 2>/dev/null | grep -q "^fish/"; then if prompt_yn "Fish update available. Update now? (y/N): " N; then sudo apt install -y fish fi fi ;; dnf|yum) sudo "$PKG_MGR" check-update || true if "$PKG_MGR" list updates | grep -q "^fish"; then if prompt_yn "Fish update available. Update now? (y/N): " N; then sudo "$PKG_MGR" update -y fish fi fi ;; pacman) sudo pacman -Sy --noconfirm if pacman -Qu | grep -q "^fish"; then if prompt_yn "Fish update available. Update now? (y/N): " N; then sudo pacman -S --noconfirm fish fi fi ;; brew) brew update if brew outdated | grep -q "^fish"; then if prompt_yn "Fish update available. Update now? (y/N): " N; then brew upgrade fish fi fi ;; esac } # -- fisher & plugins ---------------------------------------------- install_fisher() { curl -fsSL https://git.mycod.in/apt/fish_install/raw/branch/main/install_fisher.fish \ -o /tmp/install_fisher.fish chmod +x /tmp/install_fisher.fish # prevent fisher from reading our script via stdin fish /tmp/install_fisher.fish /dev/null 2>&1 } # -- main ----------------------------------------------------------- detect_platform install_gpg_if_needed if command -v fish &>/dev/null; then echo "Fish shell is already installed." update_fish else install_fish fi if prompt_yn "Install Fisher plugin manager and recommended plugins? (y/N): " N; then install_fisher install_fish_plugins echo "Fisher and plugins installed!" else echo "Skipping plugin installation." fi echo "✅ Fish shell setup complete on ${OS}!"