Sugestões sobre como este script de backup .bashrc pode ser melhorado?

2
alias isbashrcmodf='cmp -s "/home/user/.experimental/bc/$(ls /home/user/.experimental/bc -Art | tail -n 1)" "/home/user/.bashrc"'
alias bashrcbak='cp ~/.bashrc ~/.experimental/bc/.bashrc$(date +-%y-%m-%d-%H-%M-%S-%s)'
if isbashrcmodf; then
    cd $PWD
else
    bashrcbak; echo ".bashrc backed, good to go."
fi

O script acima verifica a pasta /home/user/.expiremental/bc/ do último arquivo modificado (que é o backup anterior do meu .bashrc ) e, se o atual .bashrc for diferente, será feito um backup

Eu possivelmente quero evitar a parte if .. then e só tenho o segmento if .. else . O cd $PWD é uma maneira de não fazer nada que eu usei desde que eu não encontrei nada melhor fazendo nada comando .

EDITAR :

Acabei de ler em algum lugar um artigo detalhado sobre como é perigoso analisar ls output e confiar em ls , ele continuou dizendo que é mais seguro usar glob ao longo de ls então, em vez de ls /home/user/.experimental/bc -Art | tail -n 1 , deve ser: ls /home/user/.experimental/bc/.bashrc-* -Art | tail -n 1

    
por himanshuxd 27.11.2017 / 18:22

2 respostas

1

Você pode usar o operador condicional 'OR' || e agrupar seus comandos dependentes dentro de chaves para que sejam executados juntos, embora cada comando deva ter um ; :

alias isbashrcmodf='cmp -s "/home/user/experimental/bc/$(ls /home/user/experimental/bc -Art | tail -n 1)" "/home/user/.bashrc"'
alias bashrcbak='cp ~/.bashrc ~/.experimental/bc/.bashrc$(date +-%y-%m-%d-%H-%M-%S-%s)'

isbashrcmodf || { bashrcbak ; echo ".bashrc backed, good to go."; }

Uma melhoria adicional pode ser usar o operador condicional 'AND' && para fazer o eco apenas se o comando bashrcbak for bem-sucedido:

isbashrcmodf || { bashrcbak && echo ".bashrc backed, good to go."; }
    
por Arronical 27.11.2017 / 18:31
1
  1. Use o operador NOT ! quando quiser reverter uma declaração if .

    if ! isbashrcmodf; then
    
  2. Use o operador AND && quando quiser executar um comando somente se o último comando for bem-sucedido.

    bashrcbak && echo ".bashrc backed up, good to go."
    
  3. Não se preocupe em reverter ls sort.

    ls ... -At | head -1
    
  4. Especifique quais arquivos ls deve examinar, com glob.

    ~/.experimental/bc/.bashrc-*
    
  5. Use tils e vars.

    dir=~/.experimental/bc
    bak_prev="$dir/$(ls "$dir"/.bashrc-* -At | head -1)"
    cmp -s "$bak_prev" ~/.bashrc
    

    e

    bak_next="$dir/.bashrc-$(date +%y-%m-%d-%H-%M-%S-%s)"
    cp ~/.bashrc "$bak_next"
    

    Isto é, em parte, uma questão de gosto pessoal, mas também faz com que, se você quiser alterar o diretório de backup (por exemplo), tenha apenas que modificar uma linha de código, onde $dir está definido. / p>

  6. Não use aliases quando você deve usar funções. Os aliases devem ser usados apenas em sessões interativas, principalmente para comandos que você costuma executar com um determinado conjunto de argumentos. Por exemplo. alias ls='ls --color=yes' .

    isbashrcmodf(){
        local bak_prev="$dir/$(ls "$dir"/.bashrc-* -At | head -1)"
        cmp -s "$bak_prev" ~/.bashrc
    }
    
    bashrcbak(){
        local bak_next="$dir/.bashrc-$(date +%y-%m-%d-%H-%M-%S-%s)"
        cp ~/.bashrc "$bak_next"
    }
    

    Embora, nesse caso, as funções / aliases sejam usadas apenas uma vez, não quero me incomodar, a menos que haja mais no script que você não incluiu.

  7. Preste muita atenção aos nomes dos arquivos.

    experimental (erro de digitação no script)

    .expiremental (erro de digitação na pergunta)

Na íntegra:

dir=~/.experimental/bc
bak_prev="$dir/$(ls "$dir"/.bashrc-* -At | head -1)"
if ! cmp -s "$bak_prev" ~/.bashrc; then
    bak_next="$dir/.bashrc-$(date +%y-%m-%d-%H-%M-%S-%s)"
    cp ~/.bashrc "$bak_next" &&
        echo ".bashrc backed up, good to go."
fi
    
por wjandrea 28.11.2017 / 21:37