Bash

adb pull 不接受變數作為源,給出 ’ 不存在.. 錯誤

  • August 27, 2015

我正在嘗試在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/圖片/截圖/"
亞行外殼 $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。

那麼,是什麼導致亞行拋出該錯誤?


如果重要的話,我使用的是 Slackware 14.1 並植根於 Android 4.2.1 和 5.0.2。

你的第一次嘗試就快到了。問題是 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命令行並使用adbfs掛載 Android 文件系統。

mkdir -p ~/mnt/android
adbfs ~/mnt/android
cp -Rp ~/mnt/android/Pictures/Screenshots ~/

引用自:https://unix.stackexchange.com/questions/225561