Cria arquivos tar a partir do shell script com o time stamp atual

1

Estou tentando criar um script de shell que fará o backup de meu codec do git e salvará em um diretório de backup específico com o nome do dia atual

Até agora eu tenho:

#!/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"

Não consigo criar o arquivo tar e ele sempre falha com o erro abaixo:

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

Alguma ajuda?

    
por GoodSp33d 10.03.2015 / 10:08

1 resposta

3

Nas seguintes linhas,

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

~ não está sendo expandido para seu diretório pessoal porque está entre aspas. Precisa estar fora das cotações para se expandir. Portanto, seu script está tentando abrir um arquivo que começa com um caractere literal ~ , que obviamente não existe.

Opções:

  • %código%. Geralmente, evitamos o uso de variable="$HOME/GIT_Workspace" em scripts e usamos ~ , em vez de uma boa razão que não seja a de que a expansão de til é geralmente considerada um recurso interativo que não é usado de forma não interativa. (Má razão, mas aí está você ...)
  • $HOME sem nenhuma cotação. No entanto, geralmente tentamos usar citações de forma muito diligente em scripts, em oposição ao uso interativo, porque você nunca sabe quando alguém vai aparecer e fornecer um argumento ou parâmetro com um espaço e, em seguida, a cotação é necessária. Programa defensivamente.
  • variable=~/GIT_Workspace ~ 'fora das aspas parece muito estranho, mas funciona.

Eu recomendo a primeira opção.

Outros comentários:

  • Seu script não parece usar nenhum bashismo, portanto, pode ser executado com variable=~"/GIT_Workspace" with the portátil em vez de /bin/sh . Encorajo-o a mudar a linha shebang e, em geral, a escrever scripts para /bin/bash , a menos que você possa realmente tirar proveito de algum fundamento.
  • Se você usar o formato ISO 8601 para datas ( /bin/sh ), elas serão classificadas em ordem cronológica e também livres de dependências de idioma natural. Eu encorajo você a fazer isso também.
  • Você pode considerar o backup de repositórios git usando %Y-%m-%d em vez de git . Você pode enviar para um repositório vazio que você mantém para o propósito. Você pode empurrar todos os ramos e o reflog também manterá o histórico em caso de erros.
por 10.03.2015 / 10:34