我编写了一个脚本来自动安装 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/null
到sh -c
以使其无法运行子 shell。
0>/dev/null sh -c "$(curl ....)"
您可以检查0>/dev/null
运行时0>/dev/null env zsh
和enz zsh
安装后的行为,以查看是否0>/dev/null env zsh
阻止切换到zsh
shell 或任何其他 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)