adb pull 不接受变量作为源,给出 *' 不存在..* 错误

adb pull 不接受变量作为源,给出 *' 不存在..* 错误

我正在尝试在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 ~/

相关内容