shell 进入 zsh 并执行 bash 脚本中的命令

mcb*_*n83 3 linux bash shell zsh vagrant

我正在尝试一点虚拟化,所以我一直使用 vagrant 来配置 centos7 虚拟机,现在我正在使用应用程序配置它。

我的 vagrant 配置运行一个 bootstrap.sh 文件,它是一个 bash 脚本,在其中我安装 zsh,然后我想按照https://github.com/sorin-ionescu/prezto配置它。第 1 步是启动 zsh 然后运行一些命令。

这是我目前拥有的代码。

echo "Installing zsh"
yum install -y zsh

echo "Configure zsh"
# touch /home/vagrant/.zshrc
exec /usr/bin/zsh
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
chsh -s /bin/zsh
Run Code Online (Sandbox Code Playgroud)

我希望这是我通过 ssh 进入虚拟机时的默认 shell。它似乎不起作用,vagrant up 步骤没有错误,所以我只想知道这是否可能,以及这是否正确?

谢谢

Cha*_*ffy 5

exec zsh用 zsh 替换你的 shell——但不会以任何方式告诉 zsh 实例在执行中的同一点进行拾取,甚至不会运行 bash 调用之前执行的相同脚本。

一个简单的修复方法是通过 Heredoc 将脚本的其余部分提供给 zsh:

/usr/bin/zsh <<'EOF'
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
chsh -s /bin/zsh
EOF
Run Code Online (Sandbox Code Playgroud)