Предложения о том, как можно улучшить этот сценарий резервного копирования .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. [[7]]

EDIT:

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

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

6 ответов

Вы можете использовать условный оператор «OR» || и группировать ваши зависимые команды внутри фигурных скобок, чтобы они выполнялись вместе, хотя каждая команда должна иметь трейлинг ;:

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."; }
[d1 ] Дальнейшее улучшение может заключаться в том, чтобы использовать условный оператор «И» && только для эха, если команда bashrcbak успешна:

isbashrcmodf || { bashrcbak && echo ".bashrc backed, good to go."; }
0
ответ дан 22 May 2018 в 15:51
  • 1
    Я не знаю, что cd $PWD сделал в сценарии OP, но он не появляется в вашем. – dessert 27 November 2017 в 21:34
  • 2
    @dessert cd $PWD был моим способом взлома , ничего не выполняющим в then части скрипта, так как я слишком ленив, чтобы искать и learn if .. then .. else. – Hannibal 27 November 2017 в 21:38
  • 3
    @Arronical Использует $(ls /home/user/experimental/bc -Art | tail -n 1) для получения последнего измененного файла или , который может быть улучшен? – Hannibal 27 November 2017 в 21:41
  • 4
    @ Ганнибал: D Мне нравится этот подход! – dessert 27 November 2017 в 21:46
  • 5
    @dessert * переходит к подсказке * Спасибо. – Hannibal 27 November 2017 в 21:50

Вы можете использовать условный оператор «OR» || и группировать ваши зависимые команды внутри фигурных скобок, чтобы они выполнялись вместе, хотя каждая команда должна иметь трейлинг ;:

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."; }
0
ответ дан 18 July 2018 в 02:28

Вы можете использовать условный оператор «OR» || и группировать ваши зависимые команды внутри фигурных скобок, чтобы они выполнялись вместе, хотя каждая команда должна иметь трейлинг ;:

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."; }
0
ответ дан 24 July 2018 в 17:34
Используйте оператор NOT !, если вы хотите отменить оператор if.
if ! isbashrcmodf; then
Используйте команду AND &&, если вы хотите запустить команду, только если последняя команда выполнена успешно.
bashrcbak && echo ".bashrc backed up, good to go."
Не мешайте реверсированию ls сортировки.
ls ... -At | head -1
Укажите, на какие файлы ls следует посмотреть, с помощью glob.
~/.experimental/bc/.bashrc-*
Используйте тильды и вары.
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 установлен. Не используйте псевдонимы, когда вы должны использовать функции. Псевдонимы предназначены для использования только в интерактивных сеансах, в основном для команд, которые вы часто запускаете с определенным набором аргументов. Например. [F15].
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"
}
Хотя в этом случае функции / алиасы используются только один раз, поэтому я бы даже не потрудился, если только не больше, чем сценарий, который вы не включили. Обратите особое внимание на имена файлов. 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
ответ дан 22 May 2018 в 15:51
  • 1
    Я исправил опечатку, спасибо, что указал, и +1 за то, что сказал мне, используя function, лучше, чем с помощью alias. – Hannibal 29 November 2017 в 07:38
  • 2
    Я заменяю свои псевдонимы функцией, можете ли вы указать, почему они лучше? – Hannibal 29 November 2017 в 07:39
  • 3
    @ Ганнибал В этом случае, в основном потому, что это хорошая привычка. Псевдонимы очень негибкие по сравнению с функциями. Если вы хотите сделать что-то более сложное, чем это (например, обрабатывать аргументы / параметры), вам все равно придется использовать функции. – wjandrea 29 November 2017 в 08:16
  • 4
    @Hannibal Для получения дополнительной информации см. alias vs. function в сценариях bash и В Bash, когда для псевдонима, когда скрипту и когда писать функцию? . – wjandrea 29 November 2017 в 08:19
  • 5
    прочитайте оба Qs, но ответы - это расширение вашего второго комментария, поэтому я подумал о том, чтобы спросить вас, что я мог: alias dodis='cp /blah/blah2/x /blah/blah2/x.bak; echo "didit"' или dodis() { cp /blah/blah2/x /blah/blah2/x.bak; echo "didit" }, какой из них быстрее? – Hannibal 29 November 2017 в 11:21
Используйте оператор NOT !, если вы хотите отменить оператор if. if ! isbashrcmodf; then Используйте команду AND &&, если вы хотите запустить команду, только если последняя команда выполнена успешно. bashrcbak && echo ".bashrc backed up, good to go." Не мешайте реверсированию ls. ls ... -At | head -1 Укажите, на какие файлы ls следует посмотреть, с помощью glob. ~/.experimental/bc/.bashrc-* Используйте тильды и вары. 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 установлен. Не используйте псевдонимы, если вы должны использовать функции. Псевдонимы предназначены для использования только в интерактивных сеансах, в основном для команд, которые вы часто запускаете с определенным набором аргументов. Например. [F15]. 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" } Хотя в этом случае функции / алиасы используются только один раз, поэтому я бы даже не потрудился, если только не больше, чем сценарий, который вы не включили. Обратите особое внимание на имена файлов. 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
ответ дан 18 July 2018 в 02:28
Используйте оператор NOT !, если вы хотите отменить оператор if. if ! isbashrcmodf; then Используйте команду AND &&, если вы хотите запустить команду, только если последняя команда выполнена успешно. bashrcbak && echo ".bashrc backed up, good to go." Не мешайте реверсированию ls. ls ... -At | head -1 Укажите, на какие файлы ls следует посмотреть, с помощью glob. ~/.experimental/bc/.bashrc-* Используйте тильды и вары. 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 установлен. Не используйте псевдонимы, если вы должны использовать функции. Псевдонимы предназначены для использования только в интерактивных сеансах, в основном для команд, которые вы часто запускаете с определенным набором аргументов. Например. [F15]. 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" } Хотя в этом случае функции / алиасы используются только один раз, поэтому я бы даже не потрудился, если только не больше, чем сценарий, который вы не включили. Обратите особое внимание на имена файлов. 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
ответ дан 24 July 2018 в 17:34
  • 1
    Я исправил опечатку, спасибо, что указал, и +1 за то, что сказал мне, используя function, лучше, чем с помощью alias. – Hannibal 29 November 2017 в 07:38
  • 2
    Я заменяю свои псевдонимы функцией, можете ли вы указать, почему они лучше? – Hannibal 29 November 2017 в 07:39
  • 3
    @ Ганнибал В этом случае, в основном потому, что это хорошая привычка. Псевдонимы очень негибкие по сравнению с функциями. Если вы хотите сделать что-то более сложное, чем это (например, обрабатывать аргументы / параметры), вам все равно придется использовать функции. – wjandrea 29 November 2017 в 08:16
  • 4
    @Hannibal Для получения дополнительной информации см. [D0] alias vs. function в сценариях bash и В Bash, когда для псевдонима, когда скрипту и когда писать функцию? . – wjandrea 29 November 2017 в 08:19
  • 5
    прочитайте оба Qs, но ответы - это расширение вашего второго комментария, поэтому я подумал о том, чтобы спросить вас, что я мог: alias dodis='cp /blah/blah2/x /blah/blah2/x.bak; echo "didit"' или dodis() { cp /blah/blah2/x /blah/blah2/x.bak; echo "didit" }, какой из них быстрее? – Hannibal 29 November 2017 в 11:21

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

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