我正在尝试在adb pull
命令中使用 $EXTERNAL_STORAGE 。我注意到该变量的作用域仅在 Android 中定义,因此它无法在adb pull $EXTERNAL_STORAGE/Pictures/Screenshots/ ~/
.
当然,我可以编写一个绝对路径来获取所有屏幕截图,但问题是其他的。
我尝试过:
af=$(adb shell echo \$EXTERNAL_STORAGE/图片/屏幕截图/) adb 拉 $af ~/
这给了我错误:
' does not existstorage/sdcard0/Pictures/Screenshots/
或者,如果我这样做:
af="/storage/sdcard0/图片/屏幕截图/" adb shell $af ~/
然后屏幕截图就成功获取了。
字符数有差异。对于第一种情况,$af 接收来自 的输入,和adb shell
的输出分别为 39 和 40。${#af}
echo $af | wc -c
对于直接将字符串输入 $af 的第二种情况,${#af}
和的输出echo $af | wc -c
分别为 38 和 39。
我认为这可能是尾随空格的结果,所以我在 中添加了一个空格,$af=/storage/sdcard0/Pictures/Screenshots/ "
但adb pull $af ~/
仍然运行良好。
另外,我运行了echo $af | fold -w1 | wc -l
这两种情况,输出都是 38。
那么,是什么导致 ADB 抛出该错误呢?
如果重要的话,我使用的是 Slackware 14.1 和 root 的 Android 4.2.1 和 5.0.2。
答案1
你的第一次尝试就快成功了。问题是 adb 在每行末尾添加了一个回车符,但没有任何帮助。在输出打印到终端的基本用法中你看不到它,因为行尾的回车符没有视觉效果(回车符将光标移动到当前行的开头,但随后换行符将光标移动到下一行的开头)。
当您将输出存储在变量中时,回车符位于 中$af
,然后adb pull
将其视为文件名的一部分。错误消息看起来很奇怪,因为中间有回车符,这导致消息的后半部分覆盖了前半部分。
使用变量之前删除回车符。
af=$(adb shell 'echo "$EXTERNAL_STORAGE/Pictures/Screenshots/"')
af=${af%$'\r$}
adb pull "$af" ~/
或直接
adb pull "$(adb shell 'echo "$EXTERNAL_STORAGE/Pictures/Screenshots/"' | tr -d '\r')" ~/
或者
adb pull "$(adb shell 'echo "$EXTERNAL_STORAGE"' | tr -d '\r')/Pictures/Screenshots/" ~/
或者,将回车符声明为单词分隔符,并使af
变量不带引号。仅当$af
不包含空格时这才有效。
IFS+=$'\r'
adb pull $(adb shell 'echo "$EXTERNAL_STORAGE/Pictures/Screenshots/"') ~/
或者,使用您选择的名称创建符号链接,而不是依赖环境变量。
adb shell 'ln -s "$EXTERNAL_STORAGE" /external-storage'
一劳永逸,然后复制文件
adb pull /external-storage/Pictures/Screenshots ~/
使用符号链接,您可以避免adb
命令行并使用数据库文件系统挂载 Android 文件系统。
mkdir -p ~/mnt/android
adbfs ~/mnt/android
cp -Rp ~/mnt/android/Pictures/Screenshots ~/