Bash';流程替换';-这是怎么回事?

Bash';流程替换';-这是怎么回事?,bash,fifo,Bash,Fifo,我正在使用进程替换创建一个我已经编写的速记内联XSL函数 function _quickxsl() { if [[ $1 == "head" ]] ; then cat <<'HEAD' <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xsl:stylesheet [ <!ENTITY apos "&#39;"> ]> <xsl:stylesheet v

我正在使用进程替换创建一个我已经编写的速记内联XSL函数

function _quickxsl() {
    if [[ $1 == "head" ]] ; then
        cat <<'HEAD'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
    <!ENTITY apos "&#39;">
]>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exsl="http://exslt.org/common"
    xmlns:func="http://exslt.org/functions"
    xmlns:kcc="http://www.adp.com/kcc"
    extension-element-prefixes="func kcc">
HEAD
    else
        cat <<'FOOT'
</xsl:stylesheet>
FOOT
    fi
}

function quickxsl() {
    {
        _quickxsl head && cat && _quickxsl foot
    } | xsltproc - "$@"
}
天哪,我忽略了寻找:

read(3, "<?xml version=\"1.0\" encoding=\"UT"..., 16384) = 390
read(3, "", 12288)                      = 0
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
lseek(3, 18446744073709547520, SEEK_SET) = -1 ESPIPE (Illegal seek)
read(3, "", 4096)                       = 0

read(3),似乎我在xsltproc中发现了一个错误。它无法识别FIFO文件类型,并在读取文档后尝试查找FIFO文件描述符。我提出了一个错误。解决方法是解析FIFO文件类型的xsltproc参数,并将其转换为可由xsltproc查找的临时文件


问题是什么?!很抱歉,当我按enter键时,它发布了问题,而不是插入新行。你从来没有使用FIFO,更不用说命名FIFO。你使用的是进程替换和这里的文档。我已经更新了问题。大概你知道答案了?用
strace-o xsltproc.strac替换
xsltproc
e xsltproc
,然后查看日志文件(
xsltproc.strace
),查看
xsltproc
是否多次打开和关闭该文件。如果打开和关闭,则它与管道和FIFO(以及终端)等设备不兼容无法多次读取。您可能需要稍微修改命令行,以便在日志文件名中嵌入进程名。
function quickxsl() {
    xsltproc - "$@" < <( _quickxsl head && cat && _quickxsl foot )
}
/dev/fd/63:1: parser error : Document is empty

^
/dev/fd/63:1: parser error : Start tag expected, '<' not found

^
unable to parse /dev/fd/63
function quickxsl() {
    xsltproc <( _quickxsl head && cat && _quickxsl foot ) "$@"
}
$ quickxsl <(cat xml/kconf.xml) <<QUICKXSL
QUICKXSL
+ quickxsl /dev/fd/63
++ cat xml/kconf.xml
+ xsltproc /dev/fd/62 /dev/fd/63
++ _quickxsl head
++ [[ head == \h\e\a\d ]]
++ cat
++ cat -
++ _quickxsl foot
++ [[ foot == \h\e\a\d ]]
++ cat
/dev/fd/62:1: parser error : Document is empty

^
/dev/fd/62:1: parser error : Start tag expected, '<' not found

^
cannot parse /dev/fd/62
quickxsl <(my_soap_service "query") <<XSL
    <xsl:template match="/">
        <xsl:value-of select="/some/path/text()"/>
    </xsl:template>
XSL
$ grep /dev/fd !$
grep /dev/fd /tmp/xsltproc.strace
execve("/usr/bin/xsltproc", ["xsltproc", "/dev/fd/62"], [/* 31 vars */]) = 0
stat("/dev/fd/62", {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
stat("/dev/fd/62", {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
stat("/dev/fd/62", {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
open("/dev/fd/62", O_RDONLY)            = 3
write(2, "/dev/fd/62:1: ", 14)          = 14
write(2, "/dev/fd/62:1: ", 14)          = 14
write(2, "cannot parse /dev/fd/62\n", 24) = 24
read(3, "<?xml version=\"1.0\" encoding=\"UT"..., 16384) = 390
read(3, "", 12288)                      = 0
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
lseek(3, 18446744073709547520, SEEK_SET) = -1 ESPIPE (Illegal seek)
read(3, "", 4096)                       = 0