Создание файлов tar из сценария оболочки с текущей меткой времени

Я пытаюсь создать сценарий оболочки, который будет поддерживать мою базовую базу git и сохранять в определенном резервном каталоге с именем текущего дня

Пока у меня есть:

#!/bin/bash branch="master" if [ $# -eq 1 ] then branch=$1 fi workspace="~/GIT_Workspace/my_project/" timestamp=$(date +%d_%b_%Y) filename="~/GIT_Workspace/Back/$timestamp-$branch.tar.gz" echo "*** Updating branch: $branch ***" #git -C "$workspace" checkout "$branch" #git -C "$workspace" fetch origin #git -C "$workspace" pull origin "$branch" echo "*** Saving to file $filename" tar -zcvf "$filename" "$workspace" 

Не удается создать файл tar, и он всегда терпит неудачу с ошибкой ниже:

tar: Failed to open '~/GIT_Workspace/Back/10_Mar_2015-master.tar.gz'

Любая помощь ?

В следующих строках,

 workspace="~/GIT_Workspace/my_project/" filename="~/GIT_Workspace/Back/$timestamp-$branch.tar.gz" 

~ не распространяется на ваш домашний каталог, потому что он внутри кавычек. Он должен быть вне кавычек, чтобы получить расширение. Таким образом, ваш скрипт пытается открыть файл, который начинается с символа буквального символа, который, конечно, не существует.

Опции:

  • variable="$HOME/GIT_Workspace" . Мы часто избегаем использования ~ в сценариях и вместо этого используем $HOME вместо разумной причины, кроме того, что расширение тильды обычно считается интерактивной функцией, которая лучше всего не используется не интерактивно. (Плохая причина, но вот ты …)
  • variable=~/GIT_Workspace без variable=~/GIT_Workspace вообще. Однако мы обычно стараемся использовать цитаты очень усердно в сценариях, а не в интерактивном использовании, потому что вы никогда не знаете, когда кто-то собирается прийти и предоставить аргумент или параметр с пространством в нем, а затем требуется цитата. Защищайте программу.
  • variable=~"/GIT_Workspace" with the ~ `вне кавычек выглядит очень странно, но будет работать.

Я рекомендую первый вариант.

Другие комментарии:

  • Ваш скрипт, похоже, не использует никаких базизмов, поэтому он может также работать под портативным /bin/sh вместо /bin/bash . Я призываю вас изменить строку shebang и вообще писать сценарии для /bin/sh если вы не сможете реально воспользоваться некоторым башизмом.
  • Если вы используете формат ISO 8601 для дат ( %Y-%m-%d ), то они, естественно, будут отсортированы в хронологическом порядке и также свободны от естественных языковых зависимостей. Я призываю вас сделать это тоже.
  • Возможно, вы захотите создать резервную копию git-репозиториев, используя git вместо tar . Вы можете нажать на голый репозиторий, который вы сохраните для этой цели. Вы можете нажимать все ветви, и reflog будет хранить историю также в случае ошибок.