重写脚本使其无需使用临时文件即可运行

时间:2011-02-15 13:39:57

标签: android bash scripting

我编写了一个小脚本来从Android设备中提取所有共享对象文件,以进行动态链接的本机代码开发。脚本工作正常,我可能会停在那里,但我不喜欢使用临时文件。我花了一些时间试图重新写这个,所以我不需要它,但失败了各种尝试。这是脚本:

declare -rx OUT_FILE=tmp.sh
adb shell 'cd /system/lib && for f in *.so; do echo -e "adb pull /system/lib/$f ./lib"; done' > $OUT_FILE
dos2unix $OUT_FILE
chmod +x $OUT_FILE
./$OUT_FILE
rm $OUT_FILE

我尝试使用子shell作为adb命令,并将结果分配给一个变量,然后可以将其输入sed以去除回车符。我不能那样去工作。以下是我尝试使用命令替换的示例:

res=$(adb shell 'cd /system/lib && for f in *.so; do echo -e "adb pull /system/lib/$f ./lib"; done')
echo $res > tmp.txt

现在,根据我的有限知识,我怀疑第二个解决方案中的tmp.txt文件将包含与我工作解决方案中的tmp文件相同的conent。事实并非如此。

最诚挚的问候,

安德烈

2 个答案:

答案 0 :(得分:0)

假设支持管道,那么这应该工作 - 没有中间文件。我正在疯狂地假设“dos2unix”也可以作为纯粹的过滤器使用。

adb shell 'cd /system/lib &&
           for f in *.so; do echo -e "adb pull /system/lib/$f ./lib"; done' |
dos2unix |
bash

答案 1 :(得分:0)

从上面的所有提示我设法提炼出来:

lib_list=$(adb shell 'for f in /system/lib/*.so; do echo $f; done')
for f2 in $lib_list
do
    path=$(echo $f2 | tr -d '\r');
    adb pull $path ./lib
done

这是有效的,主要问题是回车。通过使用-x调试开关运行脚本可以很好地看到这一点。