【问题标题】:chkconfig --list | grep --quiet "jetty" won't work in shell scriptschkconfig --list | grep --quiet "jetty" 在 shell 脚本中不起作用
【发布时间】:2015-01-23 04:23:19
【问题描述】:

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 -o pipefail”,那么脚本就可以正常工作。

环境:

1)CentOS release 6.6 (Final) 64bit

2)GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu)

3)GNU grep 2.6.3

【问题讨论】:

  • 你是什么意思它在脚本中不起作用?您是使用bash 还是/bin/sh 运行脚本?
  • 另外,chkconfig --list 输出确实包含“jetty”
  • 嗨,Etan,我只是以 /bin/sh 和 "./test.sh" 形式运行它,但仍然失败。正如您所问的“您的意思是它在脚本中不起作用是什么意思?” :我把“回声$?”在 "chkconfig --list | grep --quiet jetty" 之后跟踪它,但它会停在那里而不去 "echo $?"
  • 脚本的#! 行是什么? #!/bin/sh?
  • 你还没有告诉我们这里的“失败”是什么。它会爆炸吗?它会杀死一只小猫吗?它找不到输出吗?什么?

标签: bash shell


【解决方案1】:

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

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

【讨论】:

  • 嗨,tripleee:我用“set -e”试过你的方法,它奏效了,谢谢。在我的原始脚本中,如果我删除“--quiet”选项,脚本可以正常工作。不知道为什么“--quiet”会导致这个问题?
【解决方案2】:

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

所以你可以这样写:

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

【讨论】:

  • 使用[grep 但不能同时使用。
猜你喜欢
  • 2013-11-01
  • 1970-01-01
  • 2023-03-18
  • 2021-10-04
  • 2017-06-21
  • 2013-12-03
  • 2023-02-05
  • 2011-10-27
相关资源
最近更新 更多