首页 > 解决方案 > 在 bash 脚本中调试 tar 时遇到问题

问题描述

我正在尝试调试我的 bash 脚本的 tar 部分。当我在文件名周围使用引号时,tar 只是看不到文件。

我试图将 tar 行回显到文件中,它可以工作。但是在运行脚本时找不到文件

#!/bin/bash
i=0
code=0
paths=""

fatal_check() {
    if [[ $? != 0 ]]; then
        exit 2
    elif [[ $1 != "-z" && $1 != "-h" && $1 != "" ]]; then
        echo $1
        echo "unknown options"
        exit 2
    elif [[ $2 != "-z" && $2 != "-h" && $2 != "" ]]; then
        echo $2
        echo "unknown options"
        exit 2
    fi
}

fatal_check $1 $2
if [[ $1 == "-h" || $2 == "-h" ]]; then
    echo ""
    echo "bash script to infer file types and gather more information about them"
    echo ""
    echo "OPTIONS"
    echo -e "-h \t shows this help"
    echo -e "-z \t zips all regular files"
    exit 0
fi

while read stdin; do
    if [[ $stdin == "PATH "* ]]; then

        path=${stdin:5}

        if [[ -L "$path" ]]; then
            echo LINK "'$path'" "'$(readlink "$path")'"; fatal_check
        elif [[ -d "$path" ]]; then
            echo DIR "'$path'"
        elif [[ -f "$path" ]]; then
            wc=$(wc -l < "$path"); fatal_check
            ln=$(head -n 1 "$path"); fatal_check
            echo FILE "'$path'" $wc "'$ln'"
            if [[ $1 == "-z" || $2 == "-z" ]]; then
                paths="${paths}'${path}' "
            fi
        else
            >&2 echo ERROR "'$path'"
            code=1
        fi

    fi
done

if [[ $paths != "" ]]; then
    tar czf output.tgz $paths; fatal_check
fi

exit $code

这就是 tar 扔给我的。再一次,当我实际上将同一行回显到文件并将其作为命令运行时,它运行正常。

tar: './test': Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

标签: bashshell

解决方案


考虑到包含空格的文件名,使用单引号将每个文件名括起来是一种合理的处理方式。
问题是当将变量“$paths”tar作为参数传递时,单引号被逐字解释为文件名的一部分。请试试:

echo "$paths" | xargs tar czf output.tgz; fatal_check

代替:

tar czf output.tgz $paths; fatal_check

请注意,我们需要假设原始文件名不包含单引号。
希望这可以帮助。


推荐阅读