我写了一个基本的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
转换为..
来解决此问题。