![关于如何改进此 .bashrc 备份脚本有什么建议吗?](https://linux22.com/image/1151863/%E5%85%B3%E4%BA%8E%E5%A6%82%E4%BD%95%E6%94%B9%E8%BF%9B%E6%AD%A4%20.bashrc%20%E5%A4%87%E4%BB%BD%E8%84%9A%E6%9C%AC%E6%9C%89%E4%BB%80%E4%B9%88%E5%BB%BA%E8%AE%AE%E5%90%97%EF%BC%9F.png)
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
是一种不做任何事情的 hack 方法,我之所以使用这种方法,是因为我找不到更好的方法不执行任何操作的命令。
编辑:
我刚刚在某处读到一篇关于解析ls
输出并依赖的危险程度的详细文章ls
,它继续说使用更安全全局因此ls
,ls /home/user/.experimental/bc -Art | tail -n 1
它应该是:
ls /home/user/.experimental/bc/.bashrc-* -Art | tail -n 1
答案1
您可以使用条件“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."; }
进一步的改进可能是使用“AND”条件运算符,&&
仅在 bashrcbak 命令成功时回显:
isbashrcmodf || { bashrcbak && echo ".bashrc backed, good to go."; }
答案2
!
当您想要撤销某个语句时,请使用 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
。当您应该使用函数时,不要使用别名。别名仅用于交互式会话,主要用于您经常使用一组特定参数运行的命令。例如
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