Bash chkconfig--列表“grep--安静”;“码头”;韩元';不能在shell脚本中工作

Bash chkconfig--列表“grep--安静”;“码头”;韩元';不能在shell脚本中工作,bash,shell,Bash,Shell,chkconfig--list | grep--quiet“jetty”在命令行中工作,或者在脚本中不使用“set-o pipefail”,而在脚本中不使用“set-o pipefail”。为什么? 原文: #!/usr/bin/env bash set -e set -o pipefail echo -e "checking jetty is installed ...\n" echo -e "start...\n" chkconfig --list | grep --quiet "jett

chkconfig--list | grep--quiet“jetty”在命令行中工作,或者在脚本中不使用“set-o pipefail”,而在脚本中不使用“set-o pipefail”。为什么?

原文:

#!/usr/bin/env bash
set -e
set -o pipefail

echo -e "checking jetty is installed ...\n"
echo -e "start...\n"
chkconfig --list | grep --quiet "jetty"
echo $?
echo -e "end...\n"
if [ $? -eq 0 ]; then
    echo "ok"
else
    echo "fail"
fi
跟踪执行后: 它输出“Start…”,脚本在运行“chkconfig--list | grep--quiet jetty”后退出,因此“echo$?”和后面的跟踪没有输出任何内容。只是不知道为什么管道失灵。如果我注释“set-opipefail”,那么脚本就可以正常工作

环境:

1) CentOS 6.6版(最终版)64位

2) GNUBash,版本4.1.2(1)-发行版(x86_64-redhat-linux-GNU)


3) GNU grep 2.6.3

您不应该使用
set-e
,因为它会让脚本在遇到任何错误命令时退出。 另外,在
chkconfig--list | grep--quiet“jetty”
之后的
echo$?
似乎改变了您的“$?”值

所以你可以这样写:

if chkconfig --list | grep --quiet "ssh"
then
    echo "ok"
else
    echo "fail"
fi

使用
set-e
,如果
grep
没有找到匹配项,脚本将退出-
set-e
就是这样做的,它会将每个错误转换为致命错误。您需要包装任何可能在错误处理条件中失败的命令。幸运的是,即使没有
set-e
,您也应该这样编写这个特定的脚本

if chkconfig --list | grep --quiet 'jetty'; then
    echo "ok"
else
    echo "fail"
fi

你说它在脚本中不起作用是什么意思?您是否使用
bash
/bin/sh
运行脚本?另外,chkconfig--list输出确实包含“jetty”hi-Etan,我只是在/bin/sh和“/test.sh”表单中运行它,仍然失败。正如您所问的“在脚本中它不工作是什么意思?”:我在“chkconfig--list | grep--quiet jetty”后面加上“echo$?”来跟踪它,但它将在那里停止,而不转到“echo$?”,
是什么脚本的行<代码>#/bin/sh
?您还没有告诉我们什么是“失败”。它会爆炸吗?它会杀死小猫吗?它没有找到输出吗?什么?使用
[
grep
,但不能同时使用两者。嗨,tripleee:我用“set-e”尝试了你的方法,效果很好,谢谢。在我的原始脚本中,如果我删除“-quiet”选项,脚本工作正常。不知道为什么“-quiet”会导致此问题?