Когда вы добавляете репозиторий ppa к источникам программного обеспечения, вы также должны добавить ключ GPG этого репозитория.
Если вы этого не сделаете, программа обновления ПО ()запросит разрешение на установку любых пакетов из репозитория ppa, используя этот «страшный» диалог. Без ключа GPG программное обеспечение не может доверять репозиторию.
См. это, чтобы узнать, как добавить ключ GPG репозитория:https://askubuntu.com/questions/291035/how-to-add-a-gpg-key-to-the-apt-sources-keyring
Похоже, declare -a choice=$( python3 test.py )
создает массив из 1 длины, где
choice[0]='first
second
third'
Попробуйтеdeclare -a choice=( $( python3 test.py ) )
Сценарий Python печатает три строки текста. Чтобы прочитать их в массив в bash
, используйтеreadarray
:
readarray -t chose < <( python3 test.py )
printf '> %s\n' "${chose[@]}"
Команда readarray -t
будет считывать строки в заданный массив из стандартного ввода. Стандартный ввод перенаправляется из вашего скрипта Python с помощью подстановки процесса. Утилита readarray
по умолчанию считывает отдельные строки, т. е. строки текста, заканчивающиеся символом новой строки, а параметр -t
заставляет утилиту удалять завершающий символ новой строки из считываемых данных.
Вызов printf
выводит каждый элемент массива с начальным >
и пробелом. Передавая несколько аргументов printf
, что вы делаете, предоставляя ему расширение массива, подобного этому, он будет повторно использовать свою строку форматирования для вывода каждого отдельного аргумента. Это означает, что нет необходимости в цикле.
Проблема с вашим скриптом заключается в том, что вы читаете вывод из вашего скрипта Python в одну строку. Подстановка команды $( python3 test.py )
будет расширена до строки, которую вам затем придется вручную анализировать и разбивать на новые строки на правильные элементы массива.
Вы можете сделать , как предлагает Dabombber , и позволить оболочке сделать это разделение за вас с помощьюchoice=( $( python test.py ) )
(declare -a
не требуется ), но учтите, что это разделит строку на . ] любые пробелы (пробелы, табуляции и новые строки (содержимое$IFS
)по умолчанию ), что может быть не тем, что вам нужно, если вы хотите, чтобы ваши отдельные элементы массива включали пробелы.
Тогда можно было бы установить IFS
на новую строку, чтобы оболочка разделяла данные на новые строки только или считывала вывод для кода Python с помощью read
и это могут быть хорошие решения, но у вас есть readarray
встроенная утилита -в bash
, которая упрощает эту задачу.
Судя (по имени переменной и другому тексту в вашем коде, )вы можете захотеть реализовать своего рода интерактивное меню.
Это также можно сделать с помощью select
вbash
:
readarray -t options < <( python3 test.py )
echo 'Please select your option' >&2
PS3='Your selection: '
select ch in "${options[@]}"; do
[ -n "$ch" ] && break
echo 'Invalid, try again' >&2
done
printf 'You chose option %d ("%s")\n' "$REPLY" "$ch"
Это будет использовать вывод вашего скрипта Python в качестве параметров в цикле select
. Цикл будет продолжаться до тех пор, пока пользователь не выберет допустимый вариант. В конце печатается выбранный вариант (и его номер ).
Подсказка PS3
— это подсказка, используемая select
в bash
. Значение по умолчанию — #?
, за которым следует пробел.