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
insideRETURN=$(…)
。所以所有的输出都放在变量中。使用$?
就像脚本中的其他地方一样。顺便说一句,您可以将所有这些简化为如果!命令然后fi
所有函数/脚本都会运行。。。构建将完成,一切正常。只是没有stdout(stderr似乎还可以)。@SnakeDOc如果不添加time
命令会有什么不同吗?