#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 # 转换文件行尾格式
相关推荐
脏脏a3 小时前
【Linux】Linux工具漫谈:yum 与 vim,高效操作的 “左膀右臂”
linux·运维·服务器
APItesterCris3 小时前
构建弹性数据管道:利用淘宝商品 API 进行流式数据采集与处理
linux·数据库·windows
艾莉丝努力练剑3 小时前
【C++STL :stack && queue (一) 】STL:stack与queue全解析|深入使用(附高频算法题详解)
linux·开发语言·数据结构·c++·算法
bemyrunningdog3 小时前
IntelliJ IDEA合并分支到master全攻略
大数据·elasticsearch·intellij-idea
kyle~3 小时前
计算机系统---CPU的进程与线程处理
linux·服务器·c语言·c++·操作系统·计算机系统
NiKo_W4 小时前
Linux 进程通信——基于责任链模式的消息队列
linux·服务器·消息队列·责任链模式·进程通信
云飞云共享云桌面4 小时前
广东某模具制造工厂用一台云服务器供8个研发设计同时用
linux·运维·服务器·网络·自动化·制造
江公望4 小时前
Ubuntu /usr/include/x86_64-linux-gnu目录的作用浅谈
linux·ubuntu
报错小能手5 小时前
linux学习笔记(31)网络编程——TCP time_wait机制
linux·笔记·学习