gpt4 book ai didi

linux - Bash 脚本输出不会输出到标准输出

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:24 24 4
gpt4 key购买 nike

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

其中几个子脚本需要 root 权限,因此我不会以 root 身份运行所有内容,或以 sudo 身份运行所有内容,而是尝试仅以 root 身份执行需要以 root 身份运行的脚本。

我是这样完成的:

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

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

(我知道这个项目很困惑......这是一个边学边做的项目)

最佳答案

Previously, I just ran all the scripts either with sudo or just as the logged in user... which with my makefile above, would print to the terminal (stdout) and logfile. Adding the execute_as_user() function is where the issue cropped up. The scripts execute and build the project... just no display "that it's working" and no logs.

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

execute_as_user() {

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

}

execute_as_user "$@"

我还注意到您根本没有向脚本传递任何参数。这是这个意思吗?

./scripts/system.sh ???

关于linux - Bash 脚本输出不会输出到标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24546044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com