用grapa编写的软件在重定向到文件时可以写入stderr,但不能写入终端



我在使用linux shell将stderr重定向到stdout时遇到了一些问题。

我尝试测试的程序如下所示(以下称为some-binary(:

#!/bin/sh
grapa -ccmd '$file().set("/dev/fd/2","Errorn")'

以下内容确实有效:

$ ./some-binary < ./my_input 2>test.txt
$ cat test.txt
Error
$

(输出保存到文件中(

但这并不适合我:

$ ./some-binary < ./my_input 2>&1
$

(没有输出(

我不明白为什么。有人能澄清一下吗?


这可以用以下Dockerfile复制:

FROM ubuntu:focal-20220801
RUN apt update
RUN apt install wget freeglut3 libxft2 libxext6 libxinerama1 libxcursor-dev -y
RUN wget https://github.com/grapa-dev/grapa/raw/master/bin/grapa-ubuntu64.tar.gz
RUN tar -xvf grapa-ubuntu64.tar.gz -C /usr/local/bin
docker run -it $(docker build -q .) /bin/bash
root@db9abeca8b5f:/# grapa -ccmd '$file().set("/dev/fd/2","Errorn")' >/dev/null 2>test.txt
root@db9abeca8b5f:/# cat test.txt 
Error
root@db9abeca8b5f:/# grapa -ccmd '$file().set("/dev/fd/2","Errorn")' >/dev/null 2>&1      
root@db9abeca8b5f:/# 

重定向很好。Grapa只是不支持规范文件IO.

这是Grapa的$file().set:的文档

更新一行中的列。默认情况下,$VALUE列会更新。但是可以指定另一列。

根据建议,它适用于结构化文件IO。以下是源代码:

u64 size = pValue.mLength;
err = mFile.SetSize(size);
err = mFile.Write(0, 0, 0, size, pValue.mBytes);
mFile.Purge(size, 1);
err = mFile.Close();

和写入功能:

err = GetSize(fileSize);
if (err)
return((GrapaError)-1);
[...]
endPos = lseek(mFp, (blockPos*blockSize + offset), SEEK_SET);
if (endPos != (blockPos*blockSize + offset))
return((GrapaError)-1);

正如您所看到的,它强烈地假设文件是可查找的,如果不可查找,则放弃。这意味着您不能使用此函数写入端子、管道或任何非基本文件。

班上说";随着时间的推移,这个类/库将得到增强,以支持在文件系统和grapa数据库之外导航数据类型;。您可以考虑提交功能请求。

最新更新