Linux Bash脚本输出不到标准输出

Linux Bash脚本输出不到标准输出,linux,bash,stdout,Linux,Bash,Stdout,我有一个构建过程,由Make启动,它执行许多子脚本 这些子脚本中有两个需要根权限,因此,我尝试只执行需要作为根权限、作为根权限的脚本,而不是作为根权限运行所有脚本 我是这样做到的: execute_as_user() { su "$1" -s /bin/bash -c "$2;exit \$?" } Arg$1是运行脚本的用户,Arg$2是脚本 Arg$1要么是root(使用:$(whoami),因为所有内容都在sudo下),要么是当前用户的帐户(使用:$(logname)) 整个

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

这些子脚本中有两个需要
根权限
,因此,我尝试只执行需要作为
根权限
、作为
根权限
的脚本,而不是作为
根权限
运行所有脚本

我是这样做到的:

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)

为清晰起见更新:

以前,我只是使用
sudo
或以登录用户的身份运行所有脚本。。。使用上面的makefile,将打印到终端(
stdout
)和日志文件。添加
execute\u as\u user()
函数就是出现问题的地方。脚本执行并生成项目。。。只是没有显示“它正在工作”,也没有日志

更新

以下是一些片段:

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脚本:

(我知道这个项目很混乱……这是一个边学边做的项目)

以前,我只是使用sudo或作为 已登录用户。。。上面的makefile会打印到 终端(标准输出)和日志文件。添加execute_as_user()函数 这就是问题的症结所在。脚本执行并构建 项目只是没有显示“它正在工作”,也没有日志

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

execute_as_user() {

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

}

execute_as_user "$@"
我还注意到,您根本没有向脚本传递任何参数。这意味着什么

./scripts/system.sh ???

顺便说一句,您不需要
exit
语句。shell的退出状态始终是它执行的最后一个命令的退出状态。
su
不执行自己的重定向。因此,如果您没有重定向输出,它应该转到原始标准输出,该标准输出将转到管道。您正在运行
execute\u as\u user
inside
RETURN=$(…)
。所以所有的输出都放在变量中。使用
$?
就像脚本中的其他地方一样。顺便说一句,您可以将所有这些简化为
如果!命令然后fi
所有函数/脚本都会运行。。。构建将完成,一切正常。只是没有stdout(stderr似乎还可以)。@SnakeDOc如果不添加
time
命令会有什么不同吗?