Проблема с отладкой tar в скрипте bash - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь отладить часть tar моего скрипта bash. Когда я использую кавычки вокруг имен файлов, 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

1 Ответ

0 голосов
/ 09 октября 2019

Это разумный способ заключать каждое имя файла в одинарные кавычки, учитывая имена файлов, содержащие пробелы.
Проблема заключается в том, что при передаче переменной "$ paths" в tar в качестве аргумента одинарные кавычки буквально интерпретируются какчасть имени файла. Пожалуйста, попробуйте:

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

вместо:

tar czf output.tgz $paths; fatal_check

Обратите внимание, что мы должны предположить, что исходные имена файлов не содержат одинарные кавычки.
Надеюсь, это поможет.

...