0

我有一个 log_sender.pl perl 脚本,执行时会运行一个守护进程。我想使用 Shell 进行测试:

 #!/bin/bash                                                                                                                              

 function log_sender()
 {
     perl -I $HOME/script/log_sender.pl
 }

 (
   [[ "${BASH_SOURCE[0]}" == "${0}" ]] || exit 0
   function check_log_sender()
      {
          if [ "ps -aef | grep -v grep log_sender.pl" ]; then
              echo "PASSED"
              else
              echo FAILED
          fi
     }


     log_sender
     check_log_sender

 )

不幸的是,当我运行它时,我的终端变成:

 -bash-4.1$ sh log_sender.sh 
 ...   
 ...

我究竟做错了什么?

4

1 回答 1

1
> if [ "ps -aef | grep -v grep log_sender.pl" ]; then

这肯定不是你想要的。试试这个:

if ps -aef | grep -q 'log_sender\.pl'; then
    ...

在 shell 脚本中,该if构造将检查其退出状态的命令作为其参数。在您的代码中,该命令是[(也称为test),并且您在文本字符串上运行它,"ps -aef | grep -v grep log_sender.pl"这始终是正确的。

您可能打算检查是否ps -aef输出包含log_sender.pl但不包含的行grep; 这有点像,但你可以通过指定一个不匹配自身的正则表达式ps -aef | grep -v grep | grep 'log_sender\.pl'来避免额外的。grep -v

抑制任何输出的-q选项;grep退出代码指示输入是否与正则表达式匹配。

perl调用也不正确;该-I选项需要一个参数,所以你说的很有效perl,你的 Perl 解释器现在正在等待你输入一个 Perl 脚本来执行它。显然脚本是这样的,log_sender.pl所以您应该简单地删除-I(或添加一个参数,如果您确实需要添加一些 Perl 库路径以使脚本工作)。

最后,如果您编写 Bash 脚本,您应该使用 Bash 执行它。

chmod +x log_sender.sh
./log_sender.sh

或者

bash ./log_sender.sh

您使用的BASH_SOURCE构造是 Bashism,因此您的脚本在sh.

最后,主逻辑周围的括号是完全多余的。它们将导致脚本在单独的子 shell 中运行这些命令,而没有明显的好处。

于 2013-07-22T05:28:36.873 回答