Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux启动脚本中源代码其他脚本_Linux_Bash_Shell_Scripting - Fatal编程技术网

在Linux启动脚本中源代码其他脚本

在Linux启动脚本中源代码其他脚本,linux,bash,shell,scripting,Linux,Bash,Shell,Scripting,我遇到了以下脚本,其中有些内容我无法完全理解 #!/bin/sh /etc/rc.common # Copyright (C) 2006-2011 OpenWrt.org START=50 start() { mkdir -m 0755 -p /var/run/vsftpd service_start /usr/sbin/vsftpd } stop() { service_stop /usr/sbin/vsftpd } 这里如何使用

我遇到了以下脚本,其中有些内容我无法完全理解

    #!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org

START=50

start() {
        mkdir -m 0755 -p /var/run/vsftpd
        service_start /usr/sbin/vsftpd
}

stop() {
        service_stop /usr/sbin/vsftpd
}
这里如何使用“/etc/rc.common”

以下是rc.common的内容

#!/bin/sh
# Copyright (C) 2006-2011 OpenWrt.org

. $IPKG_INSTROOT/lib/functions.sh
. $IPKG_INSTROOT/lib/functions/service.sh

initscript=$1
action=${2:-help}
shift 2

start() {
        return 0
}

stop() {
        return 0
}

reload() {
        return 1
}

restart() {
        trap '' TERM
        stop "$@"
        start "$@"
}

boot() {
        start "$@"
}

shutdown() {
        stop
}

disable() {
        name="$(basename "${initscript}")"
        rm -f "$IPKG_INSTROOT"/etc/rc.d/S??$name
        rm -f "$IPKG_INSTROOT"/etc/rc.d/K??$name
}

enable() {
        name="$(basename "${initscript}")"
        disable
        [ -n "$START" -o -n "$STOP" ] || {
                echo "/etc/init.d/$name does not have a START or STOP value"
                return 1
        }
        [ "$START" ] && ln -s "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}"
        [ "$STOP"  ] && ln -s "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/K${STOP}${name##K[0-9][0-9]}"
}

enabled() {
        name="$(basename "${initscript}")"
        [ -x "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" ]
}

depends() {
        return 0
}

help() {
        cat <<EOF
Syntax: $initscript [command]

Available commands:
        start   Start the service
        stop    Stop the service
        restart Restart the service
        reload  Reload configuration files (or restart if that fails)
        enable  Enable service autostart
        disable Disable service autostart
$EXTRA_HELP
EOF
}

. "$initscript"

ALL_COMMANDS="start stop reload restart boot shutdown enable disable enabled depends ${EXTRA_COMMANDS}"
list_contains ALL_COMMANDS "$action" || action=help
[ "$action" = "reload" ] && action='eval reload "$@" || restart "$@" && :'
$action "$@"
简写为

'[ "$action" = "reload" ] && action='eval reload "$@" || restart "$@"'
谢谢大家!

来自当前Linux系统上的
execve(2)

解释器脚本

解释器脚本是具有执行权限的文本文件 已启用,且其第一行的格式为:

#! interpreter [optional-arg]
解释器必须是可用的可执行文件的有效路径名 它本身不是一个脚本。如果execve()的filename参数指定 解释器脚本,然后将使用 以下论点:

interpreter [optional-arg] filename arg...
其中arg。。。是的argv参数所指向的一系列单词
execve()

对于便携使用,可选arg应该不存在,或者不存在 指定为单个单词(即不应包含空格); [……]

我还没有见过很多在野外使用
#的脚本/bin/sh文件名
习惯用法。我发现它的用法令人困惑

也许一个简单的测试就能说明这一点。考虑到test_translator.sh中解释器行的详细信息,这些文件应该出现在/tmp/test中,这在本例中很重要

在“#!”行(rc#u解释器_行)中命名的脚本安排在最初调用的脚本中运行命令,这是我通过sourcing_script变量和shift命令执行的。你在问题中引用的代码对这种链接做了一个相当复杂的版本。如果没有这种链接,所有运行的都是解释器行中命名的文件

rc_解释器_行的内容

echo '===='
echo $0 "$@"

TESTVAR=set

sourcing_script=$1
shift

. "$sourcing_script" "$@"

echo '===='
test_translator.sh的内容

#!/bin/sh /tmp/test/rc_interpreter_line

echo '-----'
echo "My file name is test_interpreter.sh, but \$0 is $0"

echo Command line: $0 "$@"

echo "TESTVAR is '$TESTVAR'"
echo '-----'

exit 0
权限:

sh-4.2$ ls -l
total 8
-rw-r--r-- 1 dev dev 104 Aug 24 13:36 rc_interpreter_line
-rwxr-xr-x 1 dev dev 191 Aug 24 13:36 test_interpreter.sh
样本运行。首先直接运行test_interpreter.sh

sh-4.2$ ./test_interpreter.sh -opt arg1 arg2
====
/tmp/test/rc_interpreter_line ./test_interpreter.sh -opt arg1 arg2
-----
My file name is test_interpreter.sh, but $0 is /tmp/test/rc_interpreter_line
Command line: /tmp/test/rc_interpreter_line -opt arg1 arg2
TESTVAR is 'set'
-----
第二个更简单地调用shell。没有
execve(2)
behavior激发,所以这个shell的运行只是运行test_解释器.sh中的命令,将第一行视为注释

sh-4.2$ sh test_interpreter.sh -opt arg1 arg2
-----
My file name is test_interpreter.sh, but $0 is test_interpreter.sh
Command line: test_interpreter.sh -opt arg1 arg2
TESTVAR is ''
-----
但我个人倾向于完全避免使用这个成语。我更清楚的是,在脚本的早期使用命令,如:

. /etc/rc.common

…而不是依赖“有趣”行,这样做会在使用
/my_script
sh my_script

时创建不同的行为。您是第一次对整个脚本进行采样吗?是的,我只是随机选择了一个简单的脚本!所有启动脚本共享相同的起始行#/bin/sh/etc/rc.common文件开头的“hash bang”可以向解释器提供可选参数。因此,一般来说,您可以使用
#/usr/bin/sh[选项]
。但是脚本文件不被认为是shell的“选项”,我也没有见过shell脚本以这种方式作为参数提供的情况。我在
bash
中做了一个快速测试用例,没有观察到有用的行为(即,
bash
忽略了可选的脚本文件名参数)。您的
rc.common
文件显示了包含另一个脚本的正确方式(前面有一个点(
)。我在Fedora中检查了所有
rc.d
脚本,它们都没有使用您显示的机制。您有哪一个Linux发行版?它是Openwrt,一个用于无线路由器的轻量级发行版,具有32RAM或更多内存。感谢您的详细回复!但是我仍然不太明白如何通过简单地将函数名附加到启动脚本的完整路径来调用脚本中的函数。例如,“/etc/init.d/vsftpd test”将在/etc/init.d/vsftpd或/etc/rc.common.Thank中执行名为“test”的函数!
. /etc/rc.common