shell脚本不将命令输出存储为变量

时间:2018-05-28 08:39:43

标签: linux shell zsh prompt

我已经定义了一个函数来检查环境变量VIRTUAL_ENV是否已设置,如果是,请找出当前的python版本。

theme_python_prompt () {
    if [ -v VIRTUAL_ENV ]
    then
        local VERSION="$(python -V)"
        echo -n "%{$fg[yellow]%}%{$reset_color%}:${VERSION}(%{$fg[magenta]%}$(basename ${VIRTUAL_ENV})%{$reset_color%})"
    fi
}

但是,这只是将python -V的结果输出到stdout而不是将其存储到变量中。打印整个堆栈(set -x)显示以下内容:

+theme_python_prompt:1> [ -v VIRTUAL_ENV ']'                                   
+theme_python_prompt:3> python -V                    
Python 2.7.15                          
+theme_python_prompt:3> echo ''         
+theme_python_prompt:3> local VERSION=''
+theme_python_prompt:4> basename /home/hjpotter92/.virtualenvs/test-2fI9Fep8
+theme_python_prompt:4> echo -n $'%{\C-[[33m%}%{\C-[[00m%}:(%{\C-[[35m%}test-2fI9Fep8%{\C-[[00m%})'

提取我rbenv信息的类似功能正常运行:

theme_rbenv_prompt () {
    if ! type rbenv > /dev/null
    then
        echo -n ""
    else
        local VERSION="$(rbenv_prompt_info)"
        [ "$VERSION" != "system" ] && echo "%{$fg_bold[red]%}%{$reset_color%}:${VERSION} " || echo -n ""
    fi
}

其中rbenv_prompt_info来自oh-my-zsh plugin

1 个答案:

答案 0 :(得分:2)

python -V打印到stderr,而不是stdout。您需要将标准错误重定向到标准输出,否则您将获得一个空字符串。

改为使用local VERSION=$(python -V 2>&1)