linux - 在 Bash 中,如何将管道的末尾流式传输到变量中?

标签 linux bash shell unix scripting

我知道在管道末端设置的任何变量都会丢失(不包括 Bash 4 中的 shell 选项——不幸的是,这需要一个可移植的解决方案)。但是,我确信必须有一种方法可以使用文件描述符或其他方法将管道末端的输出流式传输到变量中,即使是通过一些复杂的路由也是如此! :)

理想情况下,我想要一个带有一个参数的命令/函数,一个变量的名称最终将导致包含管道其余部分的输出。

我有一个函数可以以可移植的方式找到它的下一个空闲文件描述符:

getFd ()
{
    # we'll start with 3 since 0..2 are mapped to standard in, out, and error respectively
    local myFD='3'
    # we'll get the upperbound from bash's ulimit
    local FD_MAX=$( ulimit -n )
    local FD_LOC
    if [ -e /proc/$$/fd ]
    then
        FD_LOC="/proc/$$/fd"
    elif [ -e /dev/fd ]
    then
        FD_LOC="/dev/fd"
    else
        return 1
    fi
    while [ -e "${FD_LOC}/${myFD}" ] && [ "${myFD}" -le "${FD_MAX}" ]
    do
        ((++myFD))
    done
    eval FD="${myFD}"
}

我想我可能需要做一些事情,比如之前创建一个打开的文件描述符池,可以通过一些别名 jiggery pokey 或其他东西拉入,但我希望我错过了一些更简单的方法,因为我确信必须是一种更好的方式。

我也在想如果我加上printf %s "${myFD}"最后我可以做类似 alias '{FD}'="$( getFd )" 的事情实现 Bash 4 自动查找下一个可用文件描述符的功能,以 {FD} <filename 的形式使用注意:需要有一个空间,但如果这可以工作,那么将这个功能引入 bash 3.0 将是很好的例子。此外,可能必须使用 shopt -s expand_aliases .

任何想法将不胜感激!

附言我试图避免强制 MyCommand MyVariable < <( command1 | command2 ; ) ;键入语法并且正在努力是否可以以以下结尾:$ command1 | command2 | MyCommand MyVariable ;使用类型。

最佳答案

你的问题有点令人困惑,但我猜你想将用户定义的变量名设置为第一个可用的文件描述符。

如果是这种情况,您的函数应该简单地回显 fd 编号:

getFD() {
  ...
  echo $myFD
}

然后假设 foo 包含存储 fd 的变量名称,假设它包含字符串 bar:

eval $foo=`getFD`

之后变量 bar 将包含第一个可用的 fd。

关于linux - 在 Bash 中,如何将管道的末尾流式传输到变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30008446/

相关文章:

bash 用于进行数值比较和文件存在

bash - 如何使用内部 bash shell 为 docker exec 设置当前工作目录?

linux - TERM=dumb 终端必须具备的功能

linux - rc.local 的环境

python - 为什么将 14 个字节的随机数据附加到原始以太网帧?

linux - 如何让top在后台运行?它需要运行并记录输出。不死或僵尸了

linux - (rsyslog) 过滤设施?

python - 我如何区分和修补/merge 字符串而不是文件?

linux - bash 脚本,第 30 行 : syntax error: unexpected end of file

shell - Csh - 通过 xargs 内的 awk 获取字段