我有一个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
...
...
我做错了什么?
> 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"
上运行它,它始终为true。
您可能打算检查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中运行这些命令,而没有明显的好处。