Bash 如何从管道中获取未找到的命令
我有以下bash脚本:Bash 如何从管道中获取未找到的命令,bash,shell,Bash,Shell,我有以下bash脚本: exec &>f.log function f() { echo "err: $@" exit 1 } trap 'f' ERR a=$( aaa --version 2>&1 ) echo $a 假设aaa不在$PATH中,如何在f.log中获取“command not found”消息 注意:2>&1在这里很重要,因为如果aaa命令成功,aaa将其版本放入stderr(如果存在)时,有必要使用$a值。$捕获命令的标准输出,但不
exec &>f.log
function f() {
echo "err: $@"
exit 1
}
trap 'f' ERR
a=$( aaa --version 2>&1 )
echo $a
假设aaa不在$PATH中,如何在f.log中获取“command not found”消息
注意:2>&1在这里很重要,因为如果aaa命令成功,aaa将其版本放入stderr(如果存在)时,有必要使用$a值。$捕获命令的标准输出,但不捕获标准错误
2> &1将标准错误重定向到标准输出当时指向的任何位置,并允许$catch标准错误输出
您已将标准输出和标准错误从主脚本重定向到日志文件中,因此任何出现在那里的内容都将记录在那里
然后使用'2>&1'捕获$execution中的标准错误
如果您不希望$a捕获该输出,那么将2>&1放在那里,让它进入早期的exec重定向。我实际上希望$a也从“aaa-version”捕获输出和stderr,以防“aaa-version”成功执行,否则我希望“command not found”并退出因捕获f函数而导致的1。我也希望在任何情况下都能进入f.log…除非aaa写得很糟糕,否则很多东西都是这样的-version的输出应该进入标准输出,而不是标准错误。如果这里不是这样的话,那么如果不检查错误代码和输出消息,并且自己将错误转发到输出,您就不能做您想做的事情。好的。。。我会再透露一下细节:-。。。比如说,我想检查python版本而不是“aaa”。不幸的是,在我的系统上,“python-version”被打印到stderr而不是stdout。我没有办法实现从bash捕获“command not found”消息的用例,这是正确的吗?是的,这已经失败了。正如我前几天发现的java版本一样。就我而言,应该发送到标准输出,而不是标准错误。如果不手动检查command not found的退出代码,或根据not found或类似项检查字符串,然后回显到日志,则无法执行此操作。无论如何,你都应该检查错误代码。哦,那太糟糕了。在bash脚本中,我将f函数用于其他命令。对于打印到标准输出的普通命令,这似乎不是问题-我只是跳过'2>&1'语句,它们被陷阱捕获,我在日志中得到'command not found',因此不需要在失败时检查退出状态。将明确检查此用例的退出状态-感谢您让我知道这一点!