我试图理解为什么在sh文件中使用echo命令不起作用。我用7-zip制作了一个可刷式拉链,它包含一个shell脚本。 updater脚本是
ui_print("");
run_program("/sbin/busybox", "mount", "/system");
run_program("/sbin/busybox", "mount", "/data");
package_extract_dir("test", "/tmp");
set_perm(0, 0, 0777, "/tmp/test.sh");
run_program("/tmp/test.sh");
delete_recursive("/tmp");
unmount("/system");
unmount("/data");
我的test.sh是这样的:
#!/sbin/sh
rm -rf /system/app/YouTube
echo "Delete Youtube"
test.sh删除Youtube文件夹,但echo命令不起作用。
我使用TWRP 3.2.3.0恢复。
我知道命令工作回应,因为我在recovery.log中看到它
TWRP恢复将echo重定向到日志文件; stdout和stderr被重定向到日志。
因此,如果我们想在屏幕上显示消息,我们必须创建一个函数将其重定向到正确的文件描述符。我从chainfire的supersu中找到了这个代码,它完全符合我的要求
#!/sbin/sh
OUTFD=1
readlink /proc/$$/fd/$OUTFD 2>/dev/null | grep /tmp >/dev/null
if [ "$?" -eq "0" ]; then
# rerouted to log file, we don't want our ui_print commands going there
OUTFD=0
# we are probably running in embedded mode, see if we can find the right fd
# we know the fd is a pipe and that the parent updater may have been started as
# 'update-binary 3 fd zipfile'
for FD in `ls /proc/$$/fd`; do
readlink /proc/$$/fd/$FD 2>/dev/null | grep pipe >/dev/null
if [ "$?" -eq "0" ]; then
ps | grep " 3 $FD " | grep -v grep >/dev/null
if [ "$?" -eq "0" ]; then
OUTFD=$FD
break
fi
fi
done
fi
ui_print() {
echo -n -e "ui_print $1\n" >> /proc/self/fd/$OUTFD
echo -n -e "ui_print\n" >> /proc/self/fd/$OUTFD
}
要显示消息,只需使用ui_print“message ...”
你需要使用正确的shebang
#! /bin/bash
Bash有一个内置的echo命令。如果标准回声二进制文件不起作用,您可以利用它