2015-10-09 58 views
1

从bash脚本结果,我想测试一个的virtualenv(dev)由呼叫bash函数和穿过的grep

lsvirtualenv -b | grep dev 

lsvirtualenv存在被实现为一个bash功能(-b给出了一个只用已知的virtualenv名称进行简短列表,每个名称都在单独的行中)。

我已经试过

if [[ $(lsvirtualenv -b | grep ${VENV_NAME}) ]]; then 
    echo "HAVE ${VENV_NAME}" 
else 
    echo "VENV ${VENV_NAME} missing" 
fi 

但是这给了我

lsvirtualenv: command not found 

回答

2

因为grep创建了一个有用的返回码,使用[[...]]是没有必要的。尝试:

. /path/to/virtualenvwrapper.sh 
if lsvirtualenv -b | grep -q "${VENV_NAME}" 
then 
    echo "HAVE ${VENV_NAME}" 
else 
    echo "VENV ${VENV_NAME} missing" 
fi 

两点意见:

  1. 外壳的if语句使用下面的if命令的退出代码。测试命令(如[[...]][...])可用于设置退出代码。但是,if并不需要它们。任何设置退出代码的命令都可以使用。在这种情况下,grep根据是否找到字符串来设置退出代码。

  2. -q选项grep沉默了。使用此选项,grep会设置退出代码,但不会产生任何其他输出。

  3. 这里,lsvirtualenv运行脚本的外壳,而不是一个子shell。所以,只要它可用于脚本,它就可以在这里工作,不需要输出。

+0

看来'lsvirtualenv'不提供给我的shell(我收到“lsvirtualenv:命令未找到”) – thebjorn

+0

@thebjorn您可能需要运行源'virtualenvwrapper.sh'脚本。查看更新后的答案中的新行。 – John1024

+1

我想这是有道理的,现在我想到了它..(顺便说一句,谢谢!) – thebjorn