1

.zshrc在使用oh-my-zsh时遇到了文件问题。最近,我开始尝试更加小心地处理我的基本操作系统环境,所以我安装了 Python(2 和 3)并pyenv使用homebrew。在尝试为 pyenv 配置自动完成功能时,我在 oh-my-zsh 中打开了 pyenv 插件。

这导致我的 shell 在启动期间关闭。我发现我可以通过注释掉 pyenv oh-my-zsh 插件的大部分活动部分来防止这种情况发生,但我不确定为什么会导致 shell 退出。

为了使这个问题尽可能简洁,我想知道以下函数的作用:

if [ -d $pyenvdir/bin -a $FOUND_PYENV -eq 0 ] 

插件的完整代码如下:

_homebrew-installed() {
    type brew &> /dev/null
}

_pyenv-from-homebrew-installed() {
    brew --prefix pyenv &> /dev/null
}

FOUND_PYENV=0
pyenvdirs=("$HOME/.pyenv" "/usr/local/pyenv" "/opt/pyenv")
if _homebrew-installed && _pyenv-from-homebrew-installed ; then
    pyenvdirs=($(brew --prefix pyenv) "${pyenvdirs[@]}")
fi

for pyenvdir in "${pyenvdirs[@]}" ; do
    if [ -d $pyenvdir/bin -a $FOUND_PYENV -eq 0 ] ; then
        FOUND_PYENV=1
        export PYENV_ROOT=$pyenvdir
        export PATH=${pyenvdir}/bin:$PATH
        eval "$(pyenv init --no-rehash - zsh)"

        function pyenv_prompt_info() {
            echo "$(pyenv version-name)"
        }
    fi
done
unset pyenvdir

if [ $FOUND_PYENV -eq 0 ] ; then
    function pyenv_prompt_info() { echo "system: $(python -V 2>&1 | cut -f 2 -d ' ')" }
fi

据我所知,它是这样的:

  • bin检查其中一个 pyenvdirs ( ) 中是否有目录-d $pyenvdir/bin,???? ( -a),检查我们之前是否已经找到pyenv( $FOUND_PYENV -eq 0)。

我尝试搜索 zsh 文档,但我无法弄清楚它在-a做什么。它是否像 AND 语句一样简单?如果是这样,为什么我的外壳会崩溃?有没有一种简单的方法可以将 shell 输出推送到日志文件(在 OS X 上),或者这已经完成了,我只是不知道去哪里看?

4

1 回答 1

3

做什么-a

这里-a确实意味着AND

为什么它是无证的?或者是吗?

您在 zsh 文档中没有找到此内容的原因是不鼓励使用[内置函数(也称为test;它不是zsh 语法的一部分),而建议使用条件表达式(由[[and包围]])。

以下是相关部分zshbuiltins(1)

[ [ 参数 ... ] ]

喜欢系统版本的test。为兼容性而添加;使用条件表达式代替 [...]

要查找有关参数-a的文档,[请查看test(1)

表达式 1 -a表达式 2

EXPRESSION1 和 EXPRESSION2 都为真

会发生什么-a

这意味着这条线

if [ -d $pyenvdir/bin -a $FOUND_PYENV -eq 0 ] 

首先检查是否$pyenvdir/bin存在并且是一个目录,然后检查是否$FOUND_PYENV等于0. 如果两者都为真,则执行以下块。

它应该杀死外壳吗?

这条线没有理由立即导致 shell 退出。


寻找错误

所有 shell 输出都发送到终端,因此您可以在启动时重定向它。当您在初始化期间寻找错误消息时,我建议您执行以下过程:

  1. 禁用有问题的配置
  2. 打开终端
  3. 检查 的值SHLVLecho $SHLVL
  4. 重新启用配置
  5. 从正在运行的 shell 中启动一个新的 z-shell zsh 2> zsh-error.log,这会将stderr重定向到文件“zsh-error.log”。
  6. 再次检查 的值SHLVL。如果它大于之前的值,则退出当前 shell ( exit)。(以下说明)
  7. 查看当前目录中的“zsh-error.log”。

如果 'zsh-error.log' 没有显示任何内容,您可能希望改为zsh -x 2> zsh-error.log在第 5 步中运行。这提供了 zsh 所做的任何事情的完整调试输出。这可能会变得非常大。

解释SHLVL

当外壳启动时,它会查看是否SHLVL在环境中设置。如果是这样,它会增加值,否则它会初始化SHLVL(通常使用1)。如果你的shell在第5步成功启动,SHLVL应该增加。在这种情况下,您应该停止 shell 以保持错误日志中的输出量较低。另一方面,如果SHLVL未更改,shell 将自行终止,您将返回步骤 2 中终端提供的原始 shell。

于 2014-09-26T08:24:17.653 回答