有没有一种方法可以读取命令的控制台输出而无需重定向或通过管道传输其 STDOUT/STDERR?
重定向或管道的问题是某些命令在其 STDOUT 和/或 STDERR 被重定向时表现不同,例如颜色或某些格式被删除,或者更多相关的差异。旧tput
版本需要在常规控制台上使用 STDOUT 或 STDERR 才能读取其尺寸。此外,在管道的情况下,原始命令失去了控制原始 shell 的能力,例如exit
,无法从函数内部调用脚本,其输出通过管道传输,这是不可能的。
我想要实现的是执行一个命令,以便它直接将其输出打印到控制台,能够杀死/退出 shell,但解析/处理并以防万一记录其输出。tee
将是一个明显的解决方案,但它受到上述问题的影响。
我做了一些尝试read
,运行一个循环,尝试从命令的文件描述符中读取,或者/dev/stdout
,/dev/tty
但在所有情况下,显示的命令输出中没有一行实际上是read
.
例如
#!/bin/bash
apt update 2>&1 & pid=$!
while [[ -f /proc/$pid/fd/1 ]] && read -r line
do
echo "$line" >> ./testfile
done < /proc/$pid/fd/1
还可以在后台运行 while 循环,在前台运行命令(最好是 IMO),例如:
#!/bin/bash
while read -r line
do
echo "$line" >> ./testfile
done < /dev/tty & pid=$!
apt update
kill $pid
但在这两种情况下都是./testfile
空的。
/dev/stdout
是每个进程自己的 STDOUT 文件描述符,当然不能工作。
可能有人知道如何实现这个或类似的替代方案?