执行外部脚本(oh-my-zsh installer.sh)后 bash 脚本停止

执行外部脚本(oh-my-zsh installer.sh)后 bash 脚本停止

我编写了一个脚本来自动安装 zsh 并设置一些默认配置。

function setup_zsh(){
    echo "####################################"
    echo "setup zsh"

    apt-get install -y zsh git curl
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
    # later code would not execute because now enter zsh shell

    writelines 'source /etc/profile' ~/.zshrc

    echo "setup zsh theme"
    if [ -s ~/.zshrc ]; then
        if grep -q 'ZSH_THEME' ~/.zshrc ; then
            sed -i 's/^ZSH_THEME=.*/ZSH_THEME="'${ZSH_THEME}'"/' ~/.zshrc
        else
            echo 'ZSH_THEME="'${ZSH_THEME}'"' >> ~/.zshrc
        fi
    fi
}

但我发现sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 完成后会进入 zsh shell,所以后面的代码不会执行。我该如何解决这个问题?

答案1

这是因为最后这行env zsh导致 installer.sh 运行zsh子 shell;您可以添加并重定向0>/dev/nullsh -c以使其无法运行子 shell。

0>/dev/null sh -c "$(curl ....)"

您可以检查0>/dev/null运行时0>/dev/null env zshenz zsh安装后的行为,以查看是否0>/dev/null env zsh阻止切换到zshshell 或任何其他 shell。

当您在下面询问您的密码时想要更改您的默认 shell 时,这也会导致失败/阻止。

if hash chsh >/dev/null 2>&1; then
      printf "${BLUE}Time to change your default shell to zsh!${NORMAL}\n"
      chsh -s $(grep /zsh$ /etc/shells | tail -1)

相关内容