Linux 如何在if块的变量中捕获命令错误消息

Linux 如何在if块的变量中捕获命令错误消息,linux,bash,shell,Linux,Bash,Shell,下面是我的bashshell脚本代码,在这里我想捕获if子句的错误消息,当它说作业已经在运行或无法启动变量的作业时,如何在下面的脚本中实现,或者以任何其他方式实现下面的功能 if initctl start $i ; then echo "service $i started by script" else echo "not able to start service $i" fi 如果initctl启动$i;然后 echo“由脚本启动的服务$i” 其他的 echo“无法启

下面是我的bashshell脚本代码,在这里我想捕获if子句的错误消息,当它说作业已经在运行或无法启动变量的作业时,如何在下面的脚本中实现,或者以任何其他方式实现下面的功能

if initctl start $i ; then echo "service $i started by script" else echo "not able to start service $i" fi 如果initctl启动$i;然后 echo“由脚本启动的服务$i” 其他的 echo“无法启动服务$i” fi
例如,在将stdout重定向到/dev/null之后,可以使用语法
msg=$(命令2>&11>/dev/null)
将stderr重定向到stdout。这样,它将只存储stderr:

error=$(initctl start $i 2>&1 1>/dev/null)
if [ $? -eq 0 ]; then
   echo "service $i started by script"
else
   echo "service $i could not be started. Error: $error"
fi
这将使用,以便它从
initctl start$i
捕获stderr并存储在
$error
变量中

然后,
$?
包含命令的返回代码,如中所示。如果
0
,则成功;否则,会发生一些错误。

使用“$?”变量 它存储上一条语句中的任何退出代码 有关更多信息,请参阅

initctl start $i
retval=$?
if [ $retval -eq 0 ]; then
    echo "service $i  started by script"
else
    echo "not able to start service $i"
fi

这个解决方案不会受到影响吗?因为它是从2010年开始的,我不确定它是否被修复了。。。我不知道。我这里没有Ubuntu,所以我们必须看看它是否能在OP上运行。从bug页面上看,它似乎还没有被修复。好吧,我有一个14.04 Ubuntu虚拟机,刚刚测试了你的脚本。它工作正常,我能够启动
cron
,当
cron
已经运行时,它返回了正确的错误。它确实需要
sudo
来运行,否则它会返回一个
未知作业:xxx
error+1,如果OP还想看到
stdout
如果成功,他可以执行
out=$(initctl start$i 2>&1)
,并同时用于这两个任务。