Как выбрать опцию внутри цикла while в bash

Имена пакетов хранятся в текстовом файле и группируются по символу строки #step{1,2,3...}, что я хотел бы сделать: step1) для выполнения emerge --pretend package, шаг2) вручную собрать флаги USE из предположительно появляющегося результата выполнения, показанного на экране, установить make.conf, а затем шаг 3) выполнить emerge package, Чарльз дал мне отличную демонстрацию того, как бороться с символом строки #step здесь.

У меня вопрос: если текстовый файл выглядит так, как показано ниже, который содержит только имена пакетов, можно ли использовать демонстрацию Чарльза или как мне ее переписать? В функции getSteps() в строке printf '%s\n' "$line"Я немного изменил, это не сработало.

Есть идеи? Спасибо! Текстовый файл, содержащий имена пакетов:

#step1
grub
genkernel
sys-kernel/gentoo-sources
sys-apps/pciutils
...
#step2
dev-libs/boost
sys-cluster/ceph
sys-fs/lvm2
...

Демонстрация Чарльза по адресу: здесь

То, что я хотел бы иметь что-то вроде:

getSteps() {
  local running=0
  while read -r line; do
    if (( running )); then
      if [[ $line = "#"* ]]; then
        return
      else
 #       printf '%s\n' "$line"
         #step 1)
         emerge --pretend $line
         #step 2)
         select packageType in "PACKAGEUSE" "PACKAGEKEYWORDS" "PACKAGELICENSE"
         do
             case $REPLY in 
             1) read USE flags as an input
                set make.conf
                #step 3)
                emerge $line
                ;;
             2) ....
         done
      fi
    else
      [[ $line = "#"$1 ]] && running=1
    fi
  done <stepFile
}

Эта строка ниже сработала, но проблема в том, что цикл while будет продолжаться, у пользователя нет возможности выбрать опцию и затем продолжить. Есть идеи?

printf '%s\n' "emerge --pretend $line" | sh -

Кроме того, возможно ли сохранить выходные данные в переменной для дальнейшего анализа?

1 ответ

Решение

Проблема решена попыткой этого. добавлять (your code here) </dev/tty между вашим кодом, как показано ниже.

   getSteps() {
      local running=0
      while read -r line; do
(        if (( running )); then
          if [[ $line = "#"* ]]; then
            return
          else

     #       printf '%s\n' "$line"
             #step 1)
             emerge --pretend $line
             #step 2)
             select packageType in "PACKAGEUSE" "PACKAGEKEYWORDS" "PACKAGELICENSE"
             do
                 case $REPLY in 
                 1) read USE flags as an input
                    set make.conf
                    #step 3)
                    emerge $line
                    ;;
                 2) ....
             done) </dev/tty
          fi
        else
          [[ $line = "#"$1 ]] && running=1
        fi
      done <stepFile
    }
Другие вопросы по тегам