在.sh文件中使用命令echo在TWRP恢复中不起作用。如何在TWRP中使用脚本.sh显示消息

问题描述 投票:0回答:2

我试图理解为什么在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中看到它

android sh recovery
2个回答
1
投票

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 ...”


-1
投票

你需要使用正确的shebang

#! /bin/bash

Bash有一个内置的echo命令。如果标准回声二进制文件不起作用,您可以利用它

© www.soinside.com 2019 - 2024. All rights reserved.