Скрипт не распознает файл/каталог

Для занятий нам приходится работать на удаленном сервере, который находится в школе. До сих пор я сделал много файлов на сервере, и я хотел бы создать их резервную копию на случай, если я захочу перенести их на свой ноутбук или если я случайно удалю каталог или совершу глупую ошибку. Я нашел учебник и сценарий для резервного копирования файла, и я решил изменить его, чтобы он определял, в каком каталоге он находится (который будет основным пользователем) и компакт-диск с документами. Он также создает резервные копии каталога, если он не существует. Я все еще довольно новичок в такого рода сценариях, и любые дополнительные советы или ссылки на публикации будут очень признательны.

Код:

#!/bin/bash
#######################################################
##       Simple backup script..   
## Created by Matthew Brunt: ([email protected])
## Licensed under GNU GPL v3 or later, at your option.
##   http://www.gnu.org/licenses/gpl.html
##
## Further edited by Michael Garrison to backup the 
## directory it is located in and print the contents.
#######################################################

mkdir -p Backup

#Defines our output file
OUTPUT= $( cd Backup && pwd )/backup_$(date +%Y%m%d).tar.gz

#Defines our directory to backup
BUDIR=$( cd Desktop && pwd )
#Display message about starting the backup
echo "Starting backup of directory $BUDIR to file $OUTPUT"

#Start the backup
tar -cZf $OUTPUT $BUDIR

#Checking the status of the last process:
if [ $? == 0 ]; then
        #Display confirmation message
    echo "The file:"
        echo $OUTPUT
    echo "was created as a backup for:"
        echo $BUDIR

        echo ""
    echo "Items that were backed up include:"

    for i in $BUDIR; do
            echo $i
    done
        echo ""
else
    #Display error message message
        echo "There was a problem creating:"
        echo $OUTPUT
    echo "as a backup for:"
    echo $BUDIR
fi

Я знаю, что исходный скрипт работает, и он работал, пока я не изменил переменную $OUTPUT. В настоящее время я получаю следующий результат:

./backup.sh
./backup.sh: line 15: /Users/mgarrison93/Backup/backup_20121004.tar.gz: No such file
or directory
Starting backup of directory /Users/mgarrison93/Desktop to file 
tar: no files or directories specified
There was a problem creating:

as a backup for:
/Users/mgarrison93/Desktop

Я вижу, что он не принимает имя файла, но я не знаю, как это исправить.

Я только что попытался изменить $OUTPUT на /Backups/file-name.tar.gz, который у меня был изначально, и он отлично работает. Проблема, кажется, $( cd Backup && pwd )/backup_$(date +%Y%m%d).tar.gz. Просто не уверен, что не так.


person Michael Garrison    schedule 04.10.2012    source источник
comment
Попробуйте удалить пробел после OUTPUT=, это что-нибудь даст? (Если это исправит, я опубликую ответ, объясняющий, почему)   -  person David Z    schedule 04.10.2012


Ответы (1)


Рассмотрим эти две совершенно разные части синтаксиса bash: во-первых, у вас есть синтаксис для постоянной установки переменной в значение (в текущем скрипте),

<variable>=<value>

а затем есть синтаксис для запуска команды с переменной, временно установленной в значение,

<variable>=<value> <command> <argument> ...

Разница между ними в пространстве. После =, как только bash сталкивается с пробелом без кавычек, это означает, что <value> закончилось, а все, что после него, интерпретируется как <command>.

В этой строке вашего скрипта

OUTPUT= $( cd Backup && pwd )/backup_$(date +%Y%m%d).tar.gz

у вас есть пробел после OUTPUT=. bash интерпретирует это как означающее, что OUTPUT должно быть (временно) установлено в пустую строку, а остальная часть строки, то есть результат $( cd Backup && pwd )/backup_$(date +%Y%m%d).tar.gz, представляет собой команду и аргументы, которые нужно запустить, в то время как OUTPUT равно пустой строке.

Решение состоит в том, чтобы удалить пробел. Таким образом, bash узнает, что вы пытаетесь присвоить оставшуюся часть строки как значение переменной.

person David Z    schedule 04.10.2012
comment
Большое спасибо. Я привык использовать другие языки программирования, в которых можно использовать пробелы до и после знака =. Вчера был мой первый день, когда я играл с ним, и в учебнике, которому я следовал, показывалось, как создать исходный сценарий, об этом не упоминалось. - person Michael Garrison; 04.10.2012