adb pull
コマンドに$ EXTERNAL_STORAGEを使用しようとしています。変数の範囲はAndroidでのみ定義されるためadb pull $EXTERNAL_STORAGE/Pictures/Screenshots/ ~/
。
もちろん、すべてのスクリーンショットを取得するために絶対パスを作成することもできますが、問題は他のものです。
私は以前試しました:
af=$(adb シェル エコ \$EXTERNAL_STORAGE/写真/スクリーンショット/) adb プール $af ~/
これによりエラーが発生します。
' does not existstorage/sdcard0/Pictures/Screenshots/
またはこれを行うと:
af="/storage/sdcard0/image/screenshot/" adb シェル $af ~/
これでスクリーンショットが正常に取得されました。
文字数はさまざまです。最初の場合、$ afはから入力を受け取り、adb shell
出力はそれぞれ39と40です。${#af}
echo $af | wc -c
文字列が$ afに直接入力される2番目のケースの場合、${#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とルート化された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 ~/