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
Вы можете использовать условный оператор «ИЛИ» ||
и сгруппировать зависимые команды в фигурные скобки, чтобы они выполнялись вместе, хотя каждая команда должна иметь завершающий ;
:
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."; }
Используйте оператор NOT !
, если вы хотите изменить оператор if
.
if ! isbashrcmodf; then
Используйте оператор AND &&
, если вы хотите выполнить команду, только если последняя команда выполнена успешно.
bashrcbak && echo ".bashrc backed up, good to go."
Не беспокойтесь о сортировке ls
.
ls ... -At | head -1
Укажите, какие файлы ls
следует просматривать, с глобусом.
~/.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
.
Не используйте псевдонимы, когда вы должны использовать функции. Псевдонимы предназначены для использования только в интерактивных сеансах, в основном для команд, которые вы часто запускаете с определенным набором аргументов. Например. 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"
}
Хотя в этом случае функции / псевдонимы используются только один раз, так что я бы даже не стал беспокоиться, если бы в сценарии не было ничего другого.
Обратите особое внимание на имена файлов.
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