如何 select 在 bash 中 while 循环内的选项

How to select an option inside of while loop in bash

包名存储在一个文本文件中,并按行符号#step{1,2,3...}分组,我想做的是:step1)执行emerge --pretend package, step2) 手动从屏幕上假冒的执行结果中收集USE flags,设置make.conf,然后step3) 执行emerge package。 Charles 给了我一个关于如何在 处处理行符号 #step 的出色演示。

我的问题是,如果文本文件看起来像下面这样只包含包名,是否可以使用 Charles 的演示,或者我应该如何重写它?在printf '%s\n' "$line"行的getSteps()函数中,我稍微修改了一下,还是不行。

有什么想法吗?谢谢! 包含包名称的文本文件:

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

Charles 的演示在:

我想要的是:

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 = "#" ]] && running=1
    fi
  done <stepFile
}

下面这一行有效,但问题是 'while loop' 会继续,用户无法 select 一个选项然后继续。 有什么想法吗?

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

此外,是否可以将输出存储到变量中以供进一步分析?

问题已通过尝试 this 解决。在您的代码之间添加 (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 = "#" ]] && running=1
        fi
      done <stepFile
    }