명령에 인수를 전달할 때 이스케이프 문자

명령에 인수를 전달할 때 이스케이프 문자

나는 종종 Android 휴대폰을 사용하여 오디오 파일을 WAV 파일로 휴대폰 내부 저장소에 녹음합니다. 최근에 녹음된 파일을 휴대폰에서 추출하여 데스크탑으로 옮기는 Bash 스크립트를 작성하고 싶습니다. 이것이 내가 지금까지 얻은 것입니다:

adb shell find /storage/sdcard0/Sound\ Recordings/ | tail -1 | while read file ; do
    adb pull "$file" ~/Desktop/
done

그러나 이는 실패했습니다. ADB가 올바르게 이스케이프되지 않은 것 같고 스크립트를 실행하려고 하면 다음 메시지가 나타납니다.

' does not existstorage/sdcard0/Sound Recordings/20120817T065953.wav

큰따옴표를 무시하는 것처럼 보이며 실행을 시도하면 다음과 같이 두 개가 아닌 세 개의 인수가 표시될 수 있으므로 기본적으로 모든 것이 중단됩니다.

adb pull /storage/sdcard0/Sound Recordings/20120817T065953.wav ~/Desktop/

$file필요한 경우 변수에 백슬래시를 삽입 하도록 스크립트를 어떻게 조정합니까 ? 이 경우 이것이 올바른 해결책입니까?

답변1

다른 쉘 레벨에서 실행 중이므로 확장됩니다.앞으로서브쉘에서 실행됩니다. 이 문제를 해결하는 가장 쉬운 방법은 파일 이름의 모든 특수 문자를 이스케이프 처리하는 것입니다.

adb shell find /storage/sdcard0/Sound\ Recordings/ | tail -1 | while IFS= read -r file ; do
    adb pull "$(printf %q "$file")" ~/Desktop/
done

답변2

해결책은 다음과 같습니다.

adb pull "/storage/sdcard0/Sound Recordings/$(
    adb shell ls -1t '/storage/sdcard0/Sound Recordings' |
        sed q |
        tr -d '\r'
)" .

adbWindows가 일부 캐리지 리턴을 반환하는 것처럼 문제가 발생했습니다.\r

sed q첫 번째 발생을 보여주는 재미있는 방법입니다.head -n1

관련 정보