如何 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
}
包名存储在一个文本文件中,并按行符号#step{1,2,3...}分组,我想做的是:step1)执行emerge --pretend package
, step2) 手动从屏幕上假冒的执行结果中收集USE flags,设置make.conf,然后step3) 执行emerge package
。 Charles 给了我一个关于如何在
我的问题是,如果文本文件看起来像下面这样只包含包名,是否可以使用 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
}