Предложения о том, как этот резервный сценарий .bashrc может быть улучшен?

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

Вышеупомянутый сценарий проверяет папку /home/user/.expiremental/bc/ для последнего измененного файла (который является предыдущим резервным копированием моего .bashrc) и если подарок .bashrc отличается, резервное копирование сделано

Я возможно хочу избежать if .. then часть и только имеет if .. else сегмент. cd $PWD взлом способ не сделать ничего, что я использовал, так как я не мог найти лучшее выполнение, ничто не управляет.

РЕДАКТИРОВАНИЕ:

Я просто прочитал где-нибудь подробную статью о том, как опасный это должно проанализировать ls вывод и полагается ls, это продолжало говорить, что более безопасно использовать шарик вперед ls таким образом вместо ls /home/user/.experimental/bc -Art | tail -n 1 это должно быть: ls /home/user/.experimental/bc/.bashrc-* -Art | tail -n 1

2
задан 11 December 2017 в 17:47

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)'

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

Дальнейшее усовершенствование может заключаться в использовании условного оператора «И» &&, чтобы выводить эхо только в том случае, если команда bashrcbak выполнена успешно:

isbashrcmodf || { bashrcbak && echo ".bashrc backed, good to go."; }
1
ответ дан 11 December 2017 в 17:47
  1. Используйте оператор NOT !, если вы хотите изменить оператор if.

    if ! isbashrcmodf; then
    
  2. Используйте оператор AND &&, если вы хотите выполнить команду, только если последняя команда выполнена успешно.

    bashrcbak && echo ".bashrc backed up, good to go."
    
  3. Не беспокойтесь о сортировке ls.

    ls ... -At | head -1
    
  4. Укажите, какие файлы ls следует просматривать, с глобусом.

    ~/.experimental/bc/.bashrc-*
    
  5. Использовать тильды и вари.

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

    и

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

    Это отчасти дело личного вкуса, но это также делает его таким, что если вы хотите изменить резервную папку (например), вам нужно только изменить одна строка кода, где установлено $dir.

  6. Не используйте псевдонимы, когда вы должны использовать функции. Псевдонимы предназначены для использования только в интерактивных сеансах, в основном для команд, которые вы часто запускаете с определенным набором аргументов. Например. 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"
    }
    

    Хотя в этом случае функции / псевдонимы используются только один раз, так что я бы даже не стал беспокоиться, если бы в сценарии не было ничего другого.

  7. Обратите особое внимание на имена файлов.

    experimental (опечатка в сценарии)

    .expiremental (опечатка в вопросе)

В полном объеме:

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
1
ответ дан 11 December 2017 в 17:47

Другие вопросы по тегам:

Похожие вопросы: