下面是 vsftpd 的一个副本,我需要对该脚本中下面提到的一些脚本进行一些解释:
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: vsftpd
# Required-Start: $local_fs $network $named $remote_fs $syslog
# Required-Stop: $local_fs $network $named $remote_fs $syslog
# Short-Description: Very Secure Ftp Daemon
# Description: vsftpd is a Very Secure FTP daemon. It was written completely from
# scratch
### END INIT INFO
# vsftpd This shell script takes care of starting and stopping
# standalone vsftpd.
#
# chkconfig: - 60 50
# description: Vsftpd is a ftp daemon, which is the program \
# that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
RETVAL=0
prog="vsftpd"
start() {
# Start daemons.
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 1
[ -x /usr/sbin/vsftpd ] || exit 1
if [ -d /etc/vsftpd ] ; then
CONFS=`ls /etc/vsftpd/*.conf 2>/dev/null`
[ -z "$CONFS" ] && exit 6
for i in $CONFS; do
site=`basename $i .conf`
echo -n $"Starting $prog for $site: "
daemon /usr/sbin/vsftpd $i
RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then
touch /var/lock/subsys/$prog
break
else
if [ -f /var/lock/subsys/$prog ]; then
RETVAL=0
break
fi
fi
done
else
RETVAL=1
fi
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down $prog: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
RETVAL=$?
;;
condrestart|try-restart|force-reload)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
RETVAL=$?
fi
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
exit 1
esac
exit $RETVAL
问题一
下面的命令中的 && 和 || 符号到底有什么区别,它只是进行简单的 if 检查的简单方法,还是与以下完全不同if[..something..]; then ..something.. fi
:
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 1
[ -x /usr/sbin/vsftpd ] || exit 1
问题二
我明白什么是-eq
和-gt
是(equal to
,greater than
),但是有没有一个简单的网站可以解释什么是-x
、-d
和-f
是什么?
问题三
它说需要启动,$local_fs $network $named $remote_fs $syslog
但我看不到任何地方检查这些。
任何帮助都将不胜感激
在我的操作系统上运行 Fedora 12。脚本复制自/etc/init.d/vsftpd
答案1
答案一
这只是一种简写符号。
这里:
[ ${NETWORKING} = "no" ] && exit 1
检查是否${NETWORKING}
设置为"no"
。如果返回 false(网络已启用),则第二部分不会被评估(退出 1),因为它已经为 false(&&,逻辑与)。
反过来说:
[ -x /usr/sbin/vsftpd ] || exit 1
这里我们有“或”。因此,基本上,如果vsftpd存在,则第一部分为真,不再进行进一步检查(不退出)。
答案二
男人测试:
-x FILE
FILE exists and execute (or search) permission is granted
-d FILE
FILE exists and is a directory
-f FILE
FILE exists and is a regular file
答案三
这些部分应该由外部解析。有关更多信息,请参阅此处LSB 标头。
答案2
这些都是与 bash 相关的问题,所以你的主要信息来源应该是man bash
(我同意这可能是一种非常……激烈的体验)。
至于你的问题:
- [...] 语法是“if [...]”的快捷方式,因此实际上是条件检查;“&&”表示“与”,“||”表示“或”(与 C 语言类似),这两个运算符不如果第一个操作数足以产生答案,则评估它们的第二个操作数;因此,如果网络已启动,则“&&”之后的指令将不是被执行(如果第一个操作数为假,则 and 条件不能为真),而如果文件“vsftpd”存在,则脚本将不会退出(或条件在其第一个操作数为真时为真)。此语法(使用条件来实际做某种东西(英语:something)是从 C 语言变异而来的,C 语言黑客认为它很令人困惑,但又非常聪明。
- “-x”检查可执行文件是否存在,“-d”检查目录是否存在,“-f”检查文件是否存在。
- 顶部的注释部分实际上不是注释:它们是
chkconfig
服务管理器的指令,服务管理器将根据这些“注释”处理依赖关系以及服务的启动/关闭顺序。是的,我也同意这很令人困惑。