adb
добавляет возврат каретки (он же 0x0d
, Ctrl-M
, \r
и т. д. ) перед переводом строки. Вероятно, для простоты использования программного обеспечения Windows, которое ожидает, что строки заканчиваются на CR-LF, а не только на LF.
Вы можете увидеть это сами с помощью hexdump
aka hd
, например.:
$ printf "$R" | hd
00000000 30 0d |0.|
00000002
Потому что вам нужно вернуть только одно значение (код выхода). вы можете использовать printf
вместо echo
и перенаправить весь вывод ls
на /dev/null
на устройстве Android, чтобы избежать печать любых новых строк (тогда adb не добавляет CR):
R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; printf $?')"
Если на вашем устройстве Android нет printf
или если вам нужно вернуть одну или несколько строк вывода из оболочки Android , вы можете использовать tr -d '\r'
или dos2unix
или sed 's/\r$//'
или подобное, чтобы удалить CR.
dos2unix
и sed
являются лучшим выбором, чем tr
здесь, потому что они удалят только те CR, за которыми сразу следует LF, оставляя нетронутыми любые CR, которые могут быть в другом месте в строка:
$ R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; echo $?' | dos2unix)"
$ printf "$R" | hd
00000000 30 |0|
00000001