问题描述
我想用Fish shell遍历Python虚拟环境,并打印一个两列的表,在括号中显示(1)虚拟环境名称和(2)该环境的Python版本:
ansible (3.7.7)
cookiecutter (3.7.8)
pelican (3.7.8)
tempenv-0f20326801926 (broken)
tempenv-1b0a326016370 (3.8.5)
wagtail (broken)
在给定环境中运行python --version
通常会产生其版本号。但是,如果符号链接的Python解释器不再存在,将返回如下错误:
dyld: Library not loaded: @executable_path/../.Python
Referenced from: /Virtualenvs/tempenv-0f20326801926/bin/python
Reason: image not found
fish: '/Virtualenvs/tempenv-0…' terminated by signal SIGABRT (Abort)
在后一种情况下,虚拟环境已损坏,因此我想在禁止所有错误输出的同时将Python版本号设置为broken
,以便用户仅看到打印的表,而不看到错误。 / p>
我能够通过以下节取消上述错误输出的前三行,但不能取消第四行:
begin; pushd $VIRTUALENV_HOME; and set -e dirprev[-1]; end
for i in */bin/python
set -l python_version
if test -x "$VIRTUALENV_HOME/$i"
set -l test_python ("$VIRTUALENV_HOME/$i" -V >/dev/null 2>/dev/null)
if test $status -eq 0
set python_version ("$VIRTUALENV_HOME/$i" -V | string split " ")[2]
else
set python_version broken
end
else
set python_version broken
end
printf "%-33s (%s)\n" $i $python_version
end | sed "s|/bin/python||"
begin; popd; and set -e dirprev[-1]; end
但是请尝试,但我无法弄清楚如何禁止fish: '[…]' terminated by signal SIGABRT (Abort)
行:
ansible (3.7.7)
cookiecutter (3.7.8)
pelican (3.7.8)
fish: Job 4,'"$VIRTUALFISH_HOME/$i" -V >/dev…' terminated by signal SIGABRT (Abort)
tempenv-0f20326801926 (broken)
tempenv-1b0a326016370 (3.8.5)
fish: Job 4,'"$VIRTUALFISH_HOME/$i" -V >/dev…' terminated by signal SIGABRT (Abort)
wagtail (broken)
如何改善上述节并从打印表中消除无用的错误消息?
解决方法
要注意的是,您无法抑制的错误来自执行脚本的shell。失败的python命令未编写该文件。解决方案是使用另一个Shell级别,以便您可以从该Shell抑制该作业控制错误消息,同时仍捕获您感兴趣的命令的标准输出:
Shift_Availabilities = [
(1,2,3),(3,3,(0,1,2),1)
]