在 .sh 文件中使用命令回显在 TWRP 恢复中不起作用。如何在 TWRP 中使用脚本 .sh 显示消息
Using command echo in a .sh file doesn't works in TWRP recovery. How to do to display message using script .sh in TWRP
我想了解为什么在 sh 文件中使用 echo 命令不起作用。
我用 7-zip 制作了一个 flashable zip,它包含一个 shell 脚本。
更新脚本是
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
中看到它
您需要使用正确的 shebang
#! /bin/bash
Bash 有一个内置的 echo 命令。如果标准 echo 二进制文件不起作用,您可以利用它
TWRP 恢复将回显重定向到日志文件;
stdout 和 stderror 被重定向到日志。
所以如果我们想在屏幕上显示消息,我们必须创建一个函数将它重定向到正确的文件描述符。
我从 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 \n" >> /proc/self/fd/$OUTFD
echo -n -e "ui_print\n" >> /proc/self/fd/$OUTFD
}
要显示消息只需使用 ui_print "message..."
我想了解为什么在 sh 文件中使用 echo 命令不起作用。 我用 7-zip 制作了一个 flashable zip,它包含一个 shell 脚本。 更新脚本是
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
中看到它您需要使用正确的 shebang
#! /bin/bash
Bash 有一个内置的 echo 命令。如果标准 echo 二进制文件不起作用,您可以利用它
TWRP 恢复将回显重定向到日志文件; stdout 和 stderror 被重定向到日志。
所以如果我们想在屏幕上显示消息,我们必须创建一个函数将它重定向到正确的文件描述符。 我从 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 \n" >> /proc/self/fd/$OUTFD
echo -n -e "ui_print\n" >> /proc/self/fd/$OUTFD
}
要显示消息只需使用 ui_print "message..."