#zsh# #Ubuntu# 一键安装zsh、oh-my-zsh、常用插件

复制代码
#!/bin/bash

# 确保安装了 Zsh
if ! command -v zsh &> /dev/null; then
    echo "正在安装 Zsh..."
    sudo apt-get install -y zsh || sudo yum install -y zsh || brew install zsh
fi

# 确保安装了 tmux
if ! command -v tmux &> /dev/null; then
    echo "正在安装 tmux..."
    sudo apt-get install -y tmux || sudo yum install -y tmux || brew install tmux
fi

# 检查 tmux 版本是否符合要求
TMUX_VERSION=$(tmux -V | awk '{print $2}' | sed 's/[a-z]//g')
REQUIRED_VERSION=1.9

# 确保安装了 bc (用于版本比较)
if ! command -v bc &> /dev/null; then
    echo "正在安装 bc..."
    sudo apt-get install -y bc || sudo yum install -y bc || brew install bc
fi

if (( $(echo "$TMUX_VERSION < $REQUIRED_VERSION" | bc -l) )); then
    echo "警告: tmux 版本 ($TMUX_VERSION) 低于要求版本 ($REQUIRED_VERSION)"
    echo "请参考: https://github.com/tmux/tmux/wiki/Installing"
    echo "继续安装插件,但某些功能可能无法正常工作..."
fi

# 确保安装了 git 和 curl
if ! command -v git &> /dev/null; then
    echo "正在安装 Git..."
    sudo apt-get install -y git || sudo yum install -y git || brew install git
fi

if ! command -v curl &> /dev/null; then
    echo "正在安装 curl..."
    sudo apt-get install -y curl || sudo yum install -y curl || brew install curl
fi

# 检查并安装 Oh My Zsh
if [ ! -d "${HOME}/.oh-my-zsh" ]; then
    echo "正在安装 Oh My Zsh..."
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
fi

# 设置 ZSH_CUSTOM 目录路径
ZSH_CUSTOM="${ZSH_CUSTOM:-${HOME}/.oh-my-zsh/custom}"

# 定义常用插件列表
plugins=(
    zsh-users/zsh-syntax-highlighting
    zsh-users/zsh-autosuggestions
    zsh-users/zsh-completions
)

# 安装 Zsh 插件
for plugin in "${plugins[@]}"; do
    plugin_name="${plugin##*/}"
    plugin_dir="${ZSH_CUSTOM}/plugins/${plugin_name}"
    if [ ! -d "$plugin_dir" ]; then
        echo "正在安装 Zsh 插件: ${plugin_name}"
        git clone "https://github.com/${plugin}.git" "$plugin_dir"
    fi
done

# 智能更新 .zshrc 配置文件
echo "正在更新 .zshrc 配置文件..."

# 备份原有的 .zshrc
if [ -f ~/.zshrc ]; then
    cp ~/.zshrc ~/.zshrc.backup
    echo "已备份原有 .zshrc 为 ~/.zshrc.backup"
fi

# 检查并更新 ZSH_THEME
if ! grep -q "^ZSH_THEME=" ~/.zshrc 2>/dev/null; then
    echo "ZSH_THEME=\"robbyrussell\"" >> ~/.zshrc
    echo "已添加 ZSH_THEME"
fi

# 检查并更新 plugins
if grep -q "^plugins=" ~/.zshrc 2>/dev/null; then
    # 如果 plugins 行已存在,添加缺失的插件
    for plugin in tmux zsh-syntax-highlighting zsh-autosuggestions zsh-completions; do
        if ! grep -q "plugins=.*$plugin" ~/.zshrc; then
            sed -i "s/^plugins=([^)]*/& $plugin/" ~/.zshrc
            echo "已添加插件: $plugin"
        fi
    done
else
    # 如果 plugins 行不存在,添加新的 plugins 行
    echo 'plugins=(git tmux zsh-syntax-highlighting zsh-autosuggestions zsh-completions)' >> ~/.zshrc
    echo "已添加 plugins 配置"
fi

# 确保 source 行存在
if ! grep -q "source.*oh-my-zsh.sh" ~/.zshrc; then
    echo 'source $ZSH/oh-my-zsh.sh' >> ~/.zshrc
    echo "已添加 source 行"
fi

# 安装 Tmux 插件管理器 (tpm)
TMUX_PLUGINS_DIR="${HOME}/.tmux/plugins"
if [ ! -d "${TMUX_PLUGINS_DIR}/tpm" ]; then
    echo "正在安装 Tmux 插件管理器 (tpm)..."
    mkdir -p "${TMUX_PLUGINS_DIR}"
    git clone https://github.com/tmux-plugins/tpm "${TMUX_PLUGINS_DIR}/tpm"
fi

# 智能更新 .tmux.conf 配置文件
echo "正在更新 .tmux.conf 配置文件..."
TMUX_CONF="${HOME}/.tmux.conf"

# 备份原有的 tmux 配置
if [ -f "$TMUX_CONF" ]; then
    cp "$TMUX_CONF" "${TMUX_CONF}.bak"
    echo "已备份原有 tmux 配置到 ${TMUX_CONF}.bak"
fi

# 创建临时文件来构建新的 tmux 配置
TEMP_TMUX_CONF=$(mktemp)

# 如果原文件存在,先复制内容
if [ -f "$TMUX_CONF" ]; then
    cat "$TMUX_CONF" > "$TEMP_TMUX_CONF"
else
    touch "$TEMP_TMUX_CONF"
fi

# 检查并更新 TPM 路径设置
if ! grep -q "TMUX_PLUGIN_MANAGER_PATH" "$TEMP_TMUX_CONF" 2>/dev/null; then
    echo "# 设置 TPM 路径" >> "$TEMP_TMUX_CONF"
    echo 'set-environment -g TMUX_PLUGIN_MANAGER_PATH "$HOME/.tmux/plugins"' >> "$TEMP_TMUX_CONF"
    echo "已添加 TPM 路径设置"
fi

# 检查并更新插件配置
TMUX_PLUGINS=('tmux-plugins/tpm' 'tmux-plugins/tmux-resurrect' 'tmux-plugins/tmux-continuum')

for plugin in "${TMUX_PLUGINS[@]}"; do
    if ! grep -q "@plugin.*$plugin" "$TEMP_TMUX_CONF" 2>/dev/null; then
        # 如果插件配置不存在,添加
        if ! grep -q "@plugin" "$TEMP_TMUX_CONF" 2>/dev/null; then
            echo "" >> "$TEMP_TMUX_CONF"
            echo "# Tmux 插件配置" >> "$TEMP_TMUX_CONF"
        fi
        echo "set -g @plugin '$plugin'" >> "$TEMP_TMUX_CONF"
        echo "已添加插件: $plugin"
    fi
done

# 检查并更新自动保存配置
AUTO_SAVE_SETTINGS=(
    "continuum-save-interval"
    "continuum-restore"
    "resurrect-capture-pane-contents"
)

for setting in "${AUTO_SAVE_SETTINGS[@]}"; do
    if ! grep -q "@$setting" "$TEMP_TMUX_CONF" 2>/dev/null; then
        # 如果设置不存在,添加
        if ! grep -q "@continuum-" "$TEMP_TMUX_CONF" 2>/dev/null && ! grep -q "@resurrect-" "$TEMP_TMUX_CONF" 2>/dev/null; then
            echo "" >> "$TEMP_TMUX_CONF"
            echo "# 自动保存配置" >> "$TEMP_TMUX_CONF"
        fi
        
        case "$setting" in
            "continuum-save-interval")
                echo "set -g @continuum-save-interval '1'" >> "$TEMP_TMUX_CONF"
                ;;
            "continuum-restore")
                echo "set -g @continuum-restore 'on'" >> "$TEMP_TMUX_CONF"
                ;;
            "resurrect-capture-pane-contents")
                echo "set -g @resurrect-capture-pane-contents 'on'" >> "$TEMP_TMUX_CONF"
                ;;
        esac
        echo "已添加设置: $setting"
    fi
done

# 检查并更新状态栏长度设置
if ! grep -q "status-left-length" "$TEMP_TMUX_CONF" 2>/dev/null; then
    echo "" >> "$TEMP_TMUX_CONF"
    echo "# 设置左侧状态栏长度" >> "$TEMP_TMUX_CONF"
    echo "set -g status-left-length 100" >> "$TEMP_TMUX_CONF"
    echo "已添加状态栏长度设置"
fi

# 检查并更新 TPM 初始化
if ! grep -q "run.*tpm/tpm" "$TEMP_TMUX_CONF" 2>/dev/null; then
    echo "" >> "$TEMP_TMUX_CONF"
    echo "# 初始化 TPM" >> "$TEMP_TMUX_CONF"
    echo 'run '\''$HOME/.tmux/plugins/tpm/tpm'\''' >> "$TEMP_TMUX_CONF"
    echo "已添加 TPM 初始化"
fi

# 将临时文件内容写回原文件
mv "$TEMP_TMUX_CONF" "$TMUX_CONF"

# 将 Zsh 设置为默认 shell
CURRENT_SHELL=$(basename "$SHELL")
if [ "$CURRENT_SHELL" != "zsh" ]; then
    echo "将 Zsh 设置为默认 shell..."
    chsh -s $(which zsh)
else
    echo "Zsh 已经是默认 shell"
fi

# 完成提示
echo "----------------------------"
echo "安装完成!"
echo ""
echo "重要提示:"
echo "1. 请重新登录或重启终端以使用 Zsh"
echo "2. 启动新的 tmux 会话后,按 'prefix + I' (大写 I) 安装 tmux 插件"
echo ""
echo "Tmux 自动保存功能使用说明:"
echo "  - 手动保存: prefix + Ctrl-s   (prefix 通常是 Ctrl-b)"
echo "  - 恢复会话: prefix + Ctrl-r"
echo "  - 选择会话: prefix + s"
echo ""
echo "注意:"
echo "  - 原有的 .zshrc 已备份为 ~/.zshrc.backup"
echo "  - 原有的 .tmux.conf 已备份为 ~/.tmux.conf.bak"
echo "  - Tmux 自动保存功能会在后台每1分钟自动保存一次"
echo "  - 重启后进入 tmux 会自动恢复之前的会话"
echo "----------------------------"

# 如果当前在 tmux 会话中,提示重新加载配置
if [ -n "$TMUX" ]; then
    echo ""
    echo "检测到当前在 tmux 会话中,请运行以下命令重新加载配置:"
    echo "tmux source-file ~/.tmux.conf"
fi

上述代码导入到 gitee 仓库中,可以通过gitee 仓库直接下载代码运行

复制代码
wget https://gitee.com/arvinxt/sh/raw/master/install_zsh.sh
sudo chmod +x install_zsh.sh
./install_zsh.sh

如果报错脚本文件中的行尾符号

你遇到的错误是由于脚本文件中的行尾符号问题引起的。这通常发生在 Windows 和类 Unix 系统(如 Linux 和 macOS)之间传输文件时。Windows 使用 CRLF (\r\n) 作为行尾符号,而 Unix 系统使用 LF (\n)。

这个错误信息 bad interpreter: /bin/bash^M: no such file or directory 表示文件中的行结尾包含了一个多余的回车符号 ^M, 这是因为在 Windows 下保存的文本文件使用了不同的行结束符。

解决方法

方法 1: 使用 dos2unix

如果你有权限,可以使用 dos2unix 工具来转换文件格式:

复制代码
sudo apt-get install dos2unix # 如果未安装,则需要先安装 
dos2unix install_zsh.sh # 转换文件行尾格式
相关推荐
yueyuexiaokeai124 分钟前
linux kernel常用函数整理
linux·c语言
郝亚军2 小时前
ubuntu-18.04.6-desktop-amd64安装步骤
linux·运维·ubuntu
Konwledging2 小时前
kernel-devel_kernel-headers_libmodules
linux
Web极客码2 小时前
CentOS 7.x如何快速升级到CentOS 7.9
linux·运维·centos
一位赵3 小时前
小练2 选择题
linux·运维·windows
代码游侠3 小时前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
Lw老王要学习4 小时前
CentOS 7.9达梦数据库安装全流程解析
linux·运维·数据库·centos·达梦
CRUD酱4 小时前
CentOS的yum仓库失效问题解决(换镜像源)
linux·运维·服务器·centos
zly35005 小时前
VMware vCenter Converter Standalone 转换Linux系统,出现两个磁盘的处理
linux·运维·服务器
Albert Edison5 小时前
【Python】函数
java·linux·python·pip