Bash脚本输出不会转到stdout

时间:2014-07-03 06:03:14

标签: linux bash stdout

我有一个构建过程,由Make启动,执行很多子脚本。

其中一些子脚本需要root privileges,因此我不是将所有内容都运行为root,而是将所有内容都运行为sudo,而是尝试只执行需要的脚本作为rootroot

我正在这样做:

execute_as_user() {

    su "$1" -s /bin/bash -c "$2;exit \$?"

}

Arg $ 1是运行脚本的用户,因为arg $ 2是脚本。

Arg $ 1是root(得到:$(whoami),因为一切都在sudo下),或当前用户的帐户(得到:$(logname)

整个构建以:

开始
sudo make all

Makefile中的示例:

LOG="runtime.log"
ROTATE_LOG:=$(shell bash ./scripts/utils/rotate_log.sh)

system:
    /bin/bash -c "time ./scripts/system.sh 2>&1 | tee ${LOG}"

我的问题是......没有子脚本将输出打印到stdout。我认为这是一个几乎递归调用su root的某种问题......但我不确定。根据我的理解,这些脚本应该已经输出到stdout,所以也许我错了输出的位置?

要清楚,我看到日志文件中没有输出,也没有显示到终端(stdout)。

Updating for clarity:

以前,我只是使用sudo运行所有脚本,或者只是登录用户...使用上面的makefile,将打印到终端(stdout)和日志文件。添加execute_as_user()功能是问题出现的地方。脚本执行并构建项目......只是没有显示“它正在工作”而没有日志。

UPDATE

以下是一些片段:

system.sh摘录:

execute_script() {
    echo "Executing as user $3: $2"
    RETURN=$(execute_as_user $3 ${SYSTEM_SCRIPTS}/$2)
    if [ ${RETURN} -ne ${OK} ]
    then
        error $1 $2 ${RETURN}
    fi
}

build_package() {
    local RETURN=0
    case "$1" in
        system)
            declare -a scripts=(\
                "rootfs.sh" \
                "base_files.sh" \
                "busybox.sh" \
                "iana-etc.sh" \
                "kernel.sh" \
                "firmware.sh" \
                "bootscripts.sh" \
                "network.sh" \
                "dropbear.sh" \
                "wireless_tools.sh" \
                "e2fsprogs.sh" \
                "shared_libs.sh"
            )

            for SCRIPT_NAME in "${scripts[@]}"; do
                execute_script $1 ${SCRIPT_NAME} $(logname)
                echo ""
                echo -n "${SCRIPT_NAME}"
                show_status ${OK}
                echo ""
            done

            # finalize base system
            echo ""
            echo "Finalizing base system"
            execute_script $1 "finalize.sh" $(whoami)
            echo ""
            echo -n "finalize.sh"
            show_status ${OK}
            echo ""

            # package into tarball
            echo ""
            echo "Packing base system"
            execute_script $1 "archive.sh" $(whoami)
            echo ""
            echo -n "archive.sh"
            show_status ${OK}
            echo ""

            echo ""
            echo -n "Build System: "
            show_status ${OK}
            ;;
        *)
            echo "$1 is not supported!"
            exit 1
    esac
}

system.sh执行的示例子脚本

cd ${CLFS_SOURCES}/
tar -xvjf ${PKG_NAME}-${PKG_VERSION}.tar.bz2

cd ${CLFS_SOURCES}/${PKG_NAME}-${PKG_VERSION}/

make distclean
RESPONSE=$?
if [ ${RESPONSE} -ne 0 ]
then
    pkg_error ${RESPONSE}
    exit ${RESPONSE}
fi

ARCH="${CLFS_ARCH}" make defconfig
RESPONSE=$?
if [ ${RESPONSE} -ne 0 ]
then
    pkg_error ${RESPONSE}
    exit ${RESPONSE}
fi

# fixup some bugs with musl-libc
sed -i 's/\(CONFIG_\)\(.*\)\(INETD\)\(.*\)=y/# \1\2\3\4 is not set/g' .config
sed -i 's/\(CONFIG_IFPLUGD\)=y/# \1 is not set/' .config

etc...

这是整个system.sh脚本:

https://github.com/SnakeDoc/LiLi/blob/master/scripts/system.sh

(我知道这个项目很乱......这是一个随你学习的风格项目)

1 个答案:

答案 0 :(得分:0)

  

以前,我只是使用sudo或者只使用sudo运行所有脚本   登录用户...使用上面的makefile,将打印到   终端(stdout)和日志文件。添加execute_as_user()函数   是问题出现的地方。脚本执行并构建   项目...只是没有显示“它正在工作”而没有日志。

只是一个猜测,但你可能没有调用你的函数或没有正确调用它:

execute_as_user() {

    su "$1" -s /bin/bash -c "$2;exit \$?"

}

execute_as_user "$@"

我还注意到你根本没有向脚本传递任何参数。这是什么意思?

./scripts/system.sh ???