如何抑制 Python 调用的所有 Fish 错误输出?
How to suppress all Fish error output from Python invocation?
我想使用 Fish shell 遍历 Python 虚拟环境并打印两列 table 显示 (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
,同时抑制所有错误输出,让用户只看到打印的table 而不是错误。
我已经能够通过以下节抑制上述错误输出的前三行——但不是第四行:
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)
我怎样才能改进上面的节并从打印的 table 中消除无用的错误消息?
需要注意的是,您无法抑制的错误来自正在执行脚本的 shell。它不是由失败的 python 命令写入的。解决方案是使用另一个 shell 级别,这样您就可以抑制来自 shell 的作业控制错误消息,同时仍然捕获您感兴趣的命令的标准输出:
set -l test_python (fish -c "'$VIRTUALENV_HOME/$i' -V" 2>/dev/null)
我想使用 Fish shell 遍历 Python 虚拟环境并打印两列 table 显示 (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
,同时抑制所有错误输出,让用户只看到打印的table 而不是错误。
我已经能够通过以下节抑制上述错误输出的前三行——但不是第四行:
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)
我怎样才能改进上面的节并从打印的 table 中消除无用的错误消息?
需要注意的是,您无法抑制的错误来自正在执行脚本的 shell。它不是由失败的 python 命令写入的。解决方案是使用另一个 shell 级别,这样您就可以抑制来自 shell 的作业控制错误消息,同时仍然捕获您感兴趣的命令的标准输出:
set -l test_python (fish -c "'$VIRTUALENV_HOME/$i' -V" 2>/dev/null)