函数输出重定向到文件在shell脚本中无效

j1dl9f46  于 2023-01-17  发布在  Shell
关注(0)|答案(1)|浏览(208)

我写了一个基本的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
我的脚本中有什么错误?
请帮帮我。
谢谢

ygya80vv

ygya80vv1#

正如@user1934428评论的那样,我把cd“d”到$LOG_DIR,然后创建了相对于该目录的$OUT_FN。由于这个原因,重定向到$OUT_FN导致在$LOG_DIR中创建了一个文件,后来我被rm -r $LOG_DIR删除了。
我解决这个问题的方法是,仅在函数print_content中将cd转换为$LOG_DIR,然后在函数本身中将cd转换为..

相关问题