函数输出重定向到文件在 shell 脚本中不起作用



我写了一个基本的shell脚本,它采用log*.zip(从GitHub actions下载),greps特定文件中的所有匹配行,并以表格形式输出匹配的行。以下是(相关的)部分源代码:-

#!/bin/bash
....
FILENAME=$1
shift
OUT_FN=$1
shift
PATTERN=$@
....
function print_content {
LINE_LENGTH=130
LINE_LENGTH_PRINTF_FORMAT_FILENAME=$(($LINE_LENGTH-3)) # to save calculations in loop
for file in ./*; do
MATCHING_LINES=$(grep -n $PATTERN "$file" | cut -f1 -d:)
[ -z "$MATCHING_LINES" ] && continue
LONGEST_ML=$(wc -L <<< "$MATCHING_LINES")
LINE_LENGTH_PRINTF_FORMAT_LINE=$(($LINE_LENGTH-$LONGEST_ML-7))
PRINTF_FORMAT="| %-"$LONGEST_ML"s | %-"$LINE_LENGTH_PRINTF_FORMAT_LINE"s |n"
perl -E 'say "-" x '"$LINE_LENGTH"
printf "| %-"$LINE_LENGTH_PRINTF_FORMAT_FILENAME"s|n" "$file"
perl -E 'say "-" x '"$LINE_LENGTH"
while IFS= read -r line; do
LINE_DATA=$(sed "$line"'q;d' $file | ansifilter | tr -d $'r')
LINE_DATA=${LINE_DATA#*Z}
LINE_DATA=$(sed 's/^[ t]*//;s/[ t]*$//' <<< "$LINE_DATA")
printf "$PRINTF_FORMAT" "$line" "${LINE_DATA:0:$LINE_LENGTH_PRINTF_FORMAT_LINE}"
for (( i=$LINE_LENGTH_PRINTF_FORMAT_LINE; i < ${#LINE_DATA}; i=$(($i+$LINE_LENGTH_PRINTF_FORMAT_LINE)) )); do
printf "$PRINTF_FORMAT" " " "${LINE_DATA:$i:$LINE_LENGTH_PRINTF_FORMAT_LINE}"
done
done <<< "$MATCHING_LINES"
perl -E 'say "-" x '"$LINE_LENGTH"
echo
done
}
LOG_DIR="build  build"
unzip $FILENAME "$LOG_DIR"'/*' >/dev/null 2>&1
cd "$LOG_DIR"
....
print_content > "$OUT_FN"
echo "Output saved to file '$OUT_FN'"
cd ..
rm -r "$LOG_DIR"

实际上,脚本并没有改变$OUT_FN的内容。我试过设置名为test-grepped.log的文件的内容,然后运行这个脚本,输出文件名为test-grepped.log。我在运行脚本之前和之后都检查了测试文件的内容,它们都是一样的。

当我改变

print_content > "$OUT_FN"

print_content

并运行脚本,我在终端中得到这个结果(预期的结果)(Unpacking debconf作为模式传递):

----------------------------------------------------------------------------------------------------------------------------------
| ./3builddistro                                                                                                                 |
----------------------------------------------------------------------------------------------------------------------------------
| 90197 | I: Unpacking debconf...                                                                                                |
----------------------------------------------------------------------------------------------------------------------------------
Output saved to file 'test-grepped.log'

这证实了函数print_content工作正常,但将其输出重定向到文件$OUT_FN不起作用。重定向整个脚本的输出也按预期工作。但是我想我的脚本本身重定向输出到文件,而不是每次做./my-script.sh ... > output.log

我的脚本中的错误是什么?

请帮助。

感谢

正如@user1934428所评论的那样,我将cd'd到$LOG_DIR,然后相对于该目录创建$OUT_FN。由于这个原因,重定向到$OUT_FN导致在$LOG_DIR中创建一个文件,后来我被rm -r $LOG_DIR删除了。

我通过仅在函数print_content内将cd转换为$LOG_DIR,然后在函数本身中将cd转换为..来解决此问题。

相关内容

  • 没有找到相关文章