我使用的是 Amazon Linux AMI,它是 RHEL 的衍生版本,它使用 SysVint 作为services
.我不是一个经验丰富的 Linux 用户,我正在了解更多信息services
,所以我在以下位置遇到了该functions
脚本/etc/init.d/functions
我就是不明白它的工作原理success
和failure
功能(还有其他类似的warning
,但它们只是相同的原理和代码)。
我的functions
脚本可以是在这里找到该success
函数如下所示:
# Log that something succeeded
success() {
[ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_success
return 0
}
echo_success() {
[ "$BOOTUP" = "color" ] && $MOVE_TO_COL
echo -n "["
[ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS
echo -n $" OK "
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
echo -n "]"
echo -ne "\r"
return 0
}
坦率地说,我不理解这一"${LSB:-}"
部分,因为我在任何地方都找不到这个LSB
变量,但重要的部分是脚本如何使用该success
函数,例如daemon
函数的最后一行是:
[ "$?" -eq 0 ] && success $"$base startup" || failure $"$base startup"
这对我来说没有任何意义,因为不会$"$base startup"
检查它后面的任何参数。我认为该字符串正在被记录,但同样,我也看不到它将如何被记录。echoed
success
echo
我想这确实有缺陷,或者我只是不理解某些东西......该函数的本质是与光标一起success
打印绿色内联,这会在某些脚本上导致一些奇怪的输出。[ OK ]
例如,我的tomcat
脚本打印[ OK ]
在终端的光标上,而不是在光标顶部的新行中打印,这真的很奇怪:
文本应该是这样的tomcat is running... [ OK ]
,但由于它打印在我的终端线上,我的用户名和 IP 裁剪了大部分内容。
那么我是否理解错了,或者success
RHEL 服务的功能是否到处都被错误地使用了?
答案1
你没有错,但我不会说这些函数正在被使用不正确地。
坦率地说,我不明白这
"${LSB:-}"
部分,因为我在任何地方都找不到这个 LSB 变量
我也找不到在任何地方设置 $LSB 的情况。我只能推测为什么要检查这个变量;完整的测试是:
[ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_success
测试的结果是echo_success
如果 BOOTUP 变量的值为不是“详细”,LSB 变量是不是放。语法${varname:-text}
定义是:
${parameter:-word} 使用默认值。
如果参数未设置或为空,则替换单词的扩展。否则,将替换参数的值。
在这里,破折号后面没有“单词”,因此如果 $LSB 未设置或为 null,则整个扩展结果为(无),这将允许测试-z
通过。
我的猜测如果您想更改 init 脚本行为,那么逻辑就在那里不是运行这些 success() 或 failure() 函数。
第二,
脚本如何使用 success 函数,例如守护程序函数的最后一行是:
[ "$?" -eq 0 ] && success $"$base startup" || failure $"$base startup"
您是正确的,因为这些参数已传递给函数,但未使用。传递未使用的参数是无害的——只是不一致/令人困惑!我的猜测这些函数的早期版本是否会查看(可能已记录?)传递的参数。
请注意,该init_crypto()
函数调用 success() (或 failure())没有参数!