Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何从管道中获取未找到的命令_Bash_Shell - Fatal编程技术网

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值。$捕获命令的标准输出,但不

我有以下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值。

$捕获命令的标准输出,但不捕获标准错误

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',因此不需要在失败时检查退出状态。将明确检查此用例的退出状态-感谢您让我知道这一点!