关于如何改进此 .bashrc 备份脚本有什么建议吗?

关于如何改进此 .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是一种不做任何事情的 hack 方法,我之所以使用这种方法,是因为我找不到更好的方法不执行任何操作的命令

编辑

我刚刚在某处读到一篇关于解析ls输出并依赖的危险程度的详细文章ls,它继续说使用更安全全局因此lsls /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

  1. !当您想要撤销某个语句时,请使用 NOT 运算符if

    if ! isbashrcmodf; then
    
  2. &&如果您希望仅当最后一条命令成功时才运行下一条命令,请使用 AND 运算符。

    bashrcbak && echo ".bashrc backed up, good to go."
    
  3. 不用费心进行反向ls排序。

    ls ... -At | head -1
    
  4. ls使用 glob 指定应该查看哪些文件。

    ~/.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

相关内容