我正在尝试运行命令并将其输出保存到变量中(因此我可以稍后解析它并从输出中提取信息)。我知道如何将它保存到变量中,但我希望它能够显示输出,不仅仅是在结尾,所以我可以看到正在执行的输出。或者甚至更好,能够显示它,并使用该信息过滤/执行其他命令。
我以为我可以以某种方式将命令传递到read
,但无法让它工作。
以下是我一直使用的示例代码:
#!/bin/bash
count=0
function theloop() {
while [ $count -lt 10 ]; do
echo "the count is $count"
sleep 1
let count=count+1
done
}
output=$(theloop)
echo "the output was:"
echo "$output"
这会输出计数,但只会在最后更新,而不是每秒写一行。
有人能告诉我如何将环路传输到read
或其他解决方案。即使只是将它保存到我之后可以解析的变量中也是好的,只要屏幕在生成计数时每秒更新一次。
我想我可以以某种方式将tee
用于临时文件,然后阅读,但这对我来说似乎是一个不优雅的解决方案。
编辑:我应该提一下,我打算在另一个我不够智能编辑的程序的输出上使用它,所以我宁愿不改变theloop()
函数的答案。
答案 0 :(得分:3)
您可以tee
将tee
输出到/dev/tty
,而不是output=$(theloop | tee /dev/tty)
输出到临时文件中。说
output=$(theloop)
而不是
count=0
function theloop() {
while [ $count -lt 10 ]; do
[ $count -eq 7 ] && { echo "the count is $count" | tee /dev/tty; } || echo "the count is $count"
sleep 1
let count=count+1
done
}
output=$(theloop)
echo "the output was:"
echo "$output"
并且在显示变量时你会得到输出。
编辑:根据您的comment,如果您只想向控制台显示计数7但将所有输出保留在变量中,您可以说:
tee
请注意,tee
现已在函数内移动。基本上,您echo
有条件地继续while read -r line; do
output+="${line}\n"
[[ $line == *7* ]] && echo ${line}
done < <(theloop)
echo "the output was:"
echo -e "${output}"
一切。
如果您无法更改功能,可以说:
{{1}}
答案 1 :(得分:1)
这不使用临时文件,而是使用临时命名管道(fifo),它不占用磁盘空间(另外,我在ramdisk上创建它,因此它甚至不会触及磁盘)。
#!/bin/bash
count=0
function theloop() {
while [ $count -lt 10 ]; do
echo "the count is $count"
sleep 1
let count=count+1
done
}
fifo=/dev/shm/foo
rm -f $fifo
mkfifo $fifo
cat <$fifo & output=$(theloop|tee $fifo)
rm $fifo
echo "the output was:"
echo "$output"
答案 2 :(得分:1)
嗯,你已经说过了。为什么不将输出管道化为read,如下所示:
theloop | while read line; do echo $line and do something with it;done
但是,请注意,您可能在读取循环中设置变量时遇到问题,以便在循环之后可以看到它们,因为管道符号后面的部分在子shell中运行。