Выполните команду bash, используя переменную script, которая содержит путь с пробелом к ​​исполняемому инструменту? - PullRequest
0 голосов
/ 20 ноября 2018

Я пишу небольшой скрипт, который сгенерирует подписанный apk.

У меня есть инструменты сборки Android, расположенные по адресу

C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/

В этой папке инструментов сборки 27.0.3 есть apksigner.bat файл, который является инструментом для подписи файла apk.

Я копирую этот файл в массив, который содержит для меня набор команд,

cmd[1]="C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/apksigner.bat"

Фактическая операция подписания происходит с использованиемкоманда, как показано ниже,

"${cmd[1]}" sign --ks "$PATH_TO_JKS_KEY" --out "$outputfile" "$inputfile"

Указанная выше команда завершается неудачно со следующим сообщением,

'C:\Users\Fname' is not recognized as an internal or external command,
operable program or batch file.

Я думаю, что проблема заключается в пробеле между Fname Lname в пути к команде.

Удивительно, но другая команда работает именно так:

cmd[0]="C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/zipalign"
"${cmd[0]}" -v -p 4 "$inputfilepath" "$outputfilepath"

В пути этой команды также есть пробел между Fname и Lname.

Environment:

Windows 10
Command runs under git bash.

Что может быть не так?

Обновление 1

Согласно предложению Nahuel Fouilleul в разделе комментариев,Я добавил код ниже до моего ошибочного кода

printf "'%s'\n" "${cmd[@]}"
set -x

Послерезультат появился на экране,

    'C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/zipalign'
'C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/apksigner.bat'
+ echo ''

+ echo 'ANDROID Apk sign operation in progress'
ANDROID Apk sign operation in progress
+ 'C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/apksigner.bat' sign --ks 'C:\Projects\Dummy\app/my-app/upload_android.jks' --out '/c/Users/Fname Lname/Desktop/cmd_test/test/20-Nov-2018_18-36-14_IST/my-app-release.apk' '/c/Users/Fname Lname/Desktop/cmd_test/test/20-Nov-2018_18-36-14_IST/my-app-release-zipalign.apk'
'C:\Users\Fname' is not recognized as an internal or external command,
operable program or batch file.
+ '[' 1 '!=' 0 ']'
+ echo 'Android apk signing failed'
Android apk signing failed
+ abortRestore gyh5dd9e65ba174f44cd2fe92c4093ed240cda06
+ git reset --hard gyh5dd9e65ba174f44cd2fe92c4093ed240cda06
HEAD is now at gyh5dd9 This is restore point test case
+ '[' 0 '!=' 0 ']'
+ exit 1

Обновление 2

После комментариев Чарльз Даффи Я попытался запустить на Mac, это работало хорошо, и ястолкнулся с еще одной проблемой, когда я использовал программное обеспечение Windows Editor (Notepad ++), которое добавляло \ r (возврат каретки) в конец каждой строки, вызывая сбой выполнения скрипта ( Ссылка на проблему возврата каретки ), так что теперьЯ решил начать работу над сценарием на компьютере Mac вместо Windows.

Важный комментарий Чарльза:

в основном, для вызова приложений Windows с экранированными именами необходимо знать, как это конкретное приложениеотменяет экранирование своей командной строки, поскольку в Windows каждая программа отвечает за анализ строки, переданной ей в виде командной строки, в свой список аргументов;напротив, в UNIX программы запускаются с массива, а не с одной строки ... поэтому слой переносимости Windows должен угадать, как изменить массив отдельных строк, передаваемых в семейство execv системных вызовов UNIX, в одну строку вспособ, которым программа, называемая родной Windows, поймет.

...