0

我正在尝试在 android 上的 magisk 模块中运行我的这部分代码,因此它使用 android mksh shell。

我的目标是跳过 $MODULESPATH 中的 Fontchanger 文件夹,因为 Fontchanger 是我的模块,并且如果该文件夹不是 fontchanger 并且它没有名为 disable 的文件并且它在 $i 中有一个 system/fonts 目录,那么只有这样代码运行。但是,当我安装我的 magisk 模块 zip 时,它会运行此代码检测 $MODULESPATH 中的 Fontchanger 并中止。这与我需要的相反。它需要跳过 Fontchanger 文件夹。

这是代码

    imageless_magisk && MODULESPATH=/data/adb/modules || MODULESPATH=/sbin/.core/img
    for i in $MODULESPATH/*; do
      if [ $i != Fontchanger ]; then
        if [ ! -f $i/disable ]; then
          if [ -d $i/system/fonts ]; then
            NAME=$(get_var $i/module.prop)
            ui_print " [!] "
            ui_print " [!] Module editing fonts detected [!] "
            ui_print " [!] Module - $NAME [!] "
            ui_print " [!] "
            abort
          fi
        fi
      fi
    done

    imageless_magisk && MODULESPATH=/data/adb/modules_update || MODULESPATH=/sbin/.core/img
    for i in $MODULESPATH/*; do
      if [ $i != Fontchanger ]; then
        if [ ! -f $i/disable ]; then
          if [ -d $i/system/fonts ]; then 
            NAME=$(get_var $i/module.prop)
            ui_print " [!] "
            ui_print " [!] Module editing fonts detected [!] "
            ui_print " [!] Module - $NAME [!] "
            ui_print " [!] "
            abort
          fi
        fi
      fi
    done


get_var() { sed -n 's/^name=//p' ${1}; }

imageless_magisk() {
  [ $MAGISK_VER_CODE -gt 18100 ]
  return $?
}

提前感谢您的任何帮助

4

2 回答 2

1

mksh上游开发者在这里☻</p>

我通常建议人们反对set -e尤其是 set -u当他们在不明显的复杂控制结构中引入故障时。但是,我目前没有看到任何使用未使用变量的东西。另一方面,最新版本的上游手册页(尚未发布)的 CAVEATS 部分之间存在交互,set -e并在最近才被追踪到:set -o pipefail

 Using set -o pipefail makes the following construct error out:

       set -e
       for x in 1 2; do
               false && echo $x
       done | cat

 This is because, while the “&amp;&” ensures that the inner command's failure
 is not taken, it sets the entire for..done loop's errorlevel, which is
 passed on by -o pipefail.  Invert the inner command: true || echo $x

可能会影响嵌套if的 s,但我不确定这里。

另一方面,这部分代码肯定检查了错误的东西:

if [ $i != Fontchanger ]; then

记住,上面那一行是……</p>

for i in $MODULESPATH/*; do

......所以$i会是这样的$MODULESPATH/Fontchanger。此外,在这种! imageless_magisk情况下,你跑了/sbin/.core/img两次。

if请允许我提出一个希望等效的重构代码(与嵌套s相比,我更喜欢失败优先的方法,并且||条件对 s 更稳定set -e,并且[[使用条件更安全):

if imageless_magisk; then
        set -A MODULESPATHS -- /data/adb/modules /data/adb/modules_update
else
        set -A MODULESPATHS -- /sbin/.core/img
fi
for MODULESPATH in "${MODULESPATHS[@]}"; do
        for i in "$MODULESPATH"/*; do
                [[ $i = */Fontchanger ]] || continue
                [[ ! -f $i/disable ]] || continue
                [[ -d $i/system/fonts ]] || continue
                NAME=$(get_var "$i"/module.prop)
                ui_print " [!] "
                ui_print " [!] Module editing fonts detected [!] "
                ui_print " [!] Module - $NAME [!] "
                ui_print " [!] "
                abort
        done
done

你甚至可以这样做:只在最后失败,列出所有具有“模块编辑字体”的目录,而不是在第一次出现后失败:

if imageless_magisk; then
        set -A MODULESPATHS -- /data/adb/modules /data/adb/modules_update
else
        set -A MODULESPATHS -- /sbin/.core/img
fi
do_abort=0
for MODULESPATH in "${MODULESPATHS[@]}"; do
        for i in "$MODULESPATH"/*; do
                [[ $i = */Fontchanger ]] || continue
                [[ ! -f $i/disable ]] || continue
                [[ -d $i/system/fonts ]] || continue
                NAME=$(get_var "$i"/module.prop)
                if (( !do_abort )); then
                        ui_print " [!] "
                        ui_print " [!] Module editing fonts detected [!] "
                        do_abort=1
                fi
                ui_print " [!] Module - $NAME [!] "
        done
done
if (( do_abort )); then
        ui_print " [!] "
        abort
fi

这些代码都应该set -u安全set -eo pipefail的。如果不是,我需要一个日志(在set -x某处添加)来查看它在哪里中断,因为我没有方便的 Magisk 环境。shell 版本 ( echo $KSH_VERSION) 也会派上用场;大多数 Android 都带有一个非常旧的mksh版本。

希望这可以帮助; 如果没有,请随时 ping 我,我会修改我的答案。

于 2019-09-25T13:20:33.340 回答
0
MODULESPATH=/data/adb/modules
imageless_magisk || MODULESPATH=/sbin/.core/img

for i in $MODULESPATH*/*; do
  if [[ $i != *Fontchanger ]] && [ ! -f $i/disable ] && [ -d $i/system/fonts ]; then
    NAME=$(get_var $i/module.prop)
    ui_print " [!] "
    ui_print " [!] Module editing fonts detected [!] "
    ui_print " [!] Module - $NAME [!] "
    ui_print " [!] "
    cancel
  fi
done

这是我们提出的可以工作并设置的代码 - euxo pipefail 也兼容,并且可以在 magisk 环境中的 Android 上工作

于 2019-09-27T23:28:52.950 回答