Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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
Linux 在Bash中,如何将管道的末尾流式处理为变量?_Linux_Bash_Shell_Unix_Scripting - Fatal编程技术网

Linux 在Bash中,如何将管道的末尾流式处理为变量?

Linux 在Bash中,如何将管道的末尾流式处理为变量?,linux,bash,shell,unix,scripting,Linux,Bash,Shell,Unix,Scripting,我知道,除了bash4中的shell选项之外,管道末尾的任何变量集都会丢失——不幸的是,这需要一个可移植的解决方案。但是,我确信一定有一种方法可以使用文件描述符或其他东西将管道末端的输出流化为变量,即使是通过一些复杂的路径!: 理想情况下,我需要一个接受一个参数的命令/函数,该参数是最终将包含管道其余部分输出的变量的名称 我有一个函数,它将以可移植的方式查找下一个免费文件描述符: getFd () { # we'll start with 3 since 0..2 are mapped

我知道,除了bash4中的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},我可以做一些类似于别名{FD}=$getFd的事情来实现Bash 4的功能,即自动查找下一个可用的文件描述符,以{FD}的形式使用。您的问题有点让人困惑,但是我想您应该将用户定义的变量名设置为第一个可用的文件描述符

如果是这种情况,您的函数只需回显fd编号:

getFD() {
  ...
  echo $myFD
}
然后假设foo包含要存储fd的变量名,假设它包含字符串栏:


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

您似乎在尝试执行对shell脚本来说太复杂的操作。考虑写一个Perl或Python脚本。你的问题听起来很有趣,但是不容易理解。读者可能会问自己一些问题:为什么这些变量丢失了?你在说什么样的外壳选择?管道的哪一端?我以为他们有两个?他们为什么不直接使用命令替换呢?这个函数能解决什么问题,或者仅仅是语法上的糖分?这个函数是如何工作的?FD_LOC中的$$没有扩展到我可以看到的任何地方。还有,为什么要在最后一行进行求值呢?我假设您想要的不仅仅是让函数将内容写入预先安排好的或通过数字fd传递的内容,然后在下一行进行读取?您希望在所需的运行环境中获得多少技巧?我认为您无法让命令本身执行此操作,因此您需要在环境中的某个位置执行变量设置。嘿,$$是一个标准的特殊bash变量,Bourne,我相信这会为您在评估时所处的shell提供PID。这与那些使用/proc文件系统来确定下一个可用fd的人有关,因为结构是/proc//fd/其中是shell的pid,是驻留在其中的文件描述符文件。这是一种语法上的甜点,尽管我正在使用它通过一些非常需要的语言扩展来构建一种更友好、更合理的shell交互方式嘿,谢谢你,不过不幸的是,我要做的远比这复杂得多。我使用的函数已经将FD变量设置为下一个可用的文件描述符。正如我在问题中所述,我已经尝试在末尾添加一个echo,只是以printf的形式,以保持其干净和可移植性,而不是在末尾添加[CR],但是,我想要的是一个可以以某种方式执行的函数或命令,可能需要一些别名转换,将导致该命令执行的管道流式传输到其第一个参数中给定的变量名称中。例如:$someCommand | anotherCommand | myCommand nameOfVarToSet,其中nameOfVarToSet是一个导出变量,其中包含如果myCommand不在终端上会显示的所有文本。另一个单词nameOfVarToSet包含用户在运行时会看到的内容:$someCommand |另一个命令本身,问题在于管道中的每个命令都是一个子shell,不包括bash4:$set+m;shopt-s拉丝管法
eval $foo=`getFD`