Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在shell select循环中使用管道选项?_Bash_Shell_Unix_Sh_Posix - Fatal编程技术网

Bash 如何在shell 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

我的目标是将选项从一个命令传递到一个使用select生成菜单的函数

Shell select循环从stdin读取数据,但是,当您在管道中时,stdin将成为前面命令的stdout,我在这里可能过于简化了

这是不幸的,因为如果从管道中读取所有选项,则select将无法打开它,并立即返回

这是我想做的,它不起作用:

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