Bash从stdout获取最后一行(合并)

时间:2019-04-12 12:17:46

标签: linux bash shell

我有一个脚本,可以执行许多不同的操作,并以清晰的方式为用户显示其完成状态。我需要一个函数,以便可以将某些字符串作为变量进行检索以进行进一步处理。 这是一个高度简化的示例:

#!/bin/bash

echo "Test script."
echo -n "1) cat file "
cat ./testfile.f &> /dev/null
if [ $? -eq 0 ]
then
    echo "$(tput hpa $(tput cols))$(tput cub 8)[OK]"
else
    echo "$(tput hpa $(tput cols))$(tput cub 8)[FAIL]"
fi
echo -n "2) make subfolder "
mkdir ./testdir &> /dev/null
if [ $? -eq 0 ]
then
    echo "$(tput hpa $(tput cols))$(tput cub 8)[OK]"
else
    echo "$(tput hpa $(tput cols))$(tput cub 8)[FAIL]"
fi

需要一些信息:

$./test.sh
Test script.
1) cat file                               [FAIL]
2) make subfolder                         [OK]

如何在脚本执行过程中获得最后一行(最好是任何字符串)?理想情况下,它将使用一个函数(这样我就可以使用结果字符串)此字符串将在同一脚本中处理。 到目前为止,我仅看到一种解决方案:使用tee重定向每个echo命令的输出。

有什么方法可以读取已经输出的数据!?

1 个答案:

答案 0 :(得分:1)

假设您有需要处理的字符串{1..5}:

process() {
   while read -r input; do
      sleep 2
      echo "Processed ${input}."
   done
}

printf "line %s\n" {1..5} | process

在这种情况下,您可能希望在处理数字之前先查看它们。
您可以通过将标准输出复制到fd 3并使用一个函数来完成此操作。

display() {
   while read -r input; do
      echo "=== ${input} ===" >&3
      echo "${input}"
   done
}

process() {
   while read -r input; do
      sleep 2
      echo "Processed ${input}."
   done
}

exec 3>&1
printf "line %s\n" {1..5} | display | process