在 .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..."