有关的:
我已阅读上述问题,但仍然不知道如何做我需要的事情。
我有一个二进制命令,我将调用getreport
该命令执行以下操作:
- 提示输入密码(提示发送到 stderr)
- 从标准输入读取密码。
- 将大量数据打印到标准输出。
我有另一个二进制命令来解析我将调用的第一个命令的输出processreport
。但是,它不适用于 stdin;它只会接受并处理在命令行上使用-i
标志指定的文件。它从文件中读取,使用读入的数据执行操作,并输出有关其操作的数据。 (该processreport
命令可以还提示输入密码,完全独立于getreport
。)
我想使用进程替换在一行中实现这一点,而不是需要一个临时文件来保存getreport
.
就像是:
processreport -i <(getreport)
但是,我不知道如何getreport
读取从航站楼它需要的密码。
这可能吗?
答案1
{ getreport | 4<&0 <&3 processreport -i /dev/fd/4; } 3<&0
如果您愿意始终明确地阅读/dev/tty
:
getreport | 3<&0 </dev/tty processreport -i /dev/fd/3
...或者更简单地说,如果您知道 stderr 将始终等于 stdin - 正如它通常在终端中所做的那样...
getreport | 3<&0 <&2 processreport -i /dev/fd/3
答案2
getreport
无法从终端读取,因为它是后台进程。
man 2 read
:
EIO:输入/输出错误。
例如,当进程位于后台进程组中,尝试从其控制终端读取数据,并且忽略或阻止 SIGTTIN 或其进程组被孤立时,就会发生这种情况。
我想,如果没有一些外壳包装,你想要的东西是不可能实现的。但也许这更接近你想要的:
mkfifo fifo; read -p "Input for FIFO: " input; echo "$input">fifo &
cat <(read bginput <fifo; echo "$bginput"); rm fifo
这显然不适用于错误密码和读取重试。
mkfifo fifo; read -p "Input for FIFO: " input; echo "$input">fifo &
processreport -i <(getreport <fifo); rm fifo