Bash 如何在shell select循环中使用管道选项?
我的目标是将选项从一个命令传递到一个使用select生成菜单的函数 Shell select循环从stdin读取数据,但是,当您在管道中时,stdin将成为前面命令的stdout,我在这里可能过于简化了 这是不幸的,因为如果从管道中读取所有选项,则select将无法打开它,并立即返回 这是我想做的,它不起作用:Bash 如何在shell select循环中使用管道选项?,bash,shell,unix,sh,posix,Bash,Shell,Unix,Sh,Posix,我的目标是将选项从一个命令传递到一个使用select生成菜单的函数 Shell select循环从stdin读取数据,但是,当您在管道中时,stdin将成为前面命令的stdout,我在这里可能过于简化了 这是不幸的,因为如果从管道中读取所有选项,则select将无法打开它,并立即返回 这是我想做的,它不起作用: pipe_select() { select foo in $(cat <&0) do echo ${foo
pipe_select() {
select foo in $(cat <&0)
do
echo ${foo};
break;
done
}
echo "ga bu zo me" | pipe_select
我找到的解决方案如下:
pipe_select() {
opts=$(cat <&0);
exec <&3 3<&-;
select foo in ${opts}
do
echo ${foo};
break;
done
}
exec 3<&0
echo "ga bu zo me" | pipe_select
我有一个命令生成选项,我用它来保存我的stdin,使之免受管道的恶意破坏。调用pipe_select时,我解析上一个命令的输出,然后将stdin重置为select读取。此后,其他一切都只是标准的选择行为
这其实是我一直想做的p一种更通用的方法,允许在选定的项目中使用空格
#!/usr/bin/env bash
pipe_select() {
readarray -t opts
select foo in "${opts[@]}"
do
echo ${foo};
break;
done < /dev/tty
}
printf "%s\n" ga bu zo me | pipe_select
printf "%s\n" "option 1" "option 2" | pipe_select
你应该接受他的答案,或者至少投上一票,而不是复制到这里。谢谢,我在另一个问题上投了一票。它已经被接受了。谢谢,我没有想过用那种方式。在我的现实世界中,我通过curl获得一个JSON负载,然后在我的select函数中使用jq解析它。readarray比cat/exec更简单。
#!/usr/bin/env bash
pipe_select() {
readarray -t opts
select foo in "${opts[@]}"
do
echo ${foo};
break;
done < /dev/tty
}
printf "%s\n" ga bu zo me | pipe_select
printf "%s\n" "option 1" "option 2" | pipe_select