Shell进入zsh并从bash脚本执行命令

时间:2015-05-12 10:33:37

标签: linux bash shell vagrant zsh

我尝试了一点虚拟化,所以我一直在使用vagrant配置centos7 vm,现在我正在使用应用程序进行配置。

我的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

我希望这是当我进入虚拟机时的默认shell。它似乎没有工作,流浪者上升步骤没有错误所以我只想知道这是否可能,如果这似乎是正确的?

由于

2 个答案:

答案 0 :(得分:4)

name用zsh替换你的shell - 但是不会以任何方式告诉zsh的实例在执行的同一点获取,或者甚至运行与之前的bash调用相同的脚本执行完毕。

一个简单的解决方法是通过heredoc将剩余的脚本提供给zsh:

exec zsh

答案 1 :(得分:3)

exec /usr/bin/zsh使用新的 zsh 进程替换正在运行的脚本。之后的一切都没有被执行。

您基本上有两种选择:

  1. 将特定于 zsh 的内容放入单独的脚本中并使用/usr/bin/zsh运行:

    流浪:

    echo "Installing zsh"
    yum install -y zsh
    
    echo "Configure zsh"
    # touch /home/vagrant/.zshrc
    git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
    
    # run external script
    /usr/bin/zsh /home/vagrant/install-prezto.zsh
    
    chsh -s /bin/zsh
    

    /home/vagrant/install-prezto.zsh

    setopt EXTENDED_GLOB
    for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
      ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
    done
    
  2. 修改脚本,以便安装不需要 zsh

    echo "Installing zsh"
    yum install -y zsh
    
    echo "Configure zsh"
    # touch /home/vagrant/.zshrc
    git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
    
    # use find instead of *zsh* to link files
    find "${ZDOTDIR:-$HOME}/.zprezto/runcoms/" -maxdepth 1 -type f -! -name README.md --exec ln -s {} "${ZDOTDIR:-$HOME}/" +
    
    chsh -s /bin/zsh