gpt4 book ai didi

Bash:需要帮助将变量传递给 rsync

转载 作者:行者123 更新时间:2023-12-05 08:54:14 25 4
gpt4 key购买 nike

我想传递 $home 作为运行 rsync 时要排除的目录列表。文件:

cat backup_system.sh
#!/bin/bash
set -x
home=''
home=$home'"/home/ravas/Documents/*"',
home=$home'"/home/ravas/Downloads/*"',
home=$home'"/home/ravas/pCloudDrive/*"',
home=$home'"/home/ravas/pCloudLocal/*"',
home=$home'"/home/ravas.old/*"'
echo $home
sudo rsync -aAXv / --exclude={$home,"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /run/media/ravas/system_backup

备份在没有 $home 变量的情况下运行良好,但如果我添加它,它就没有任何效果。

输出的最后两行显示 $home 中列出的目录未使用 --exclude 展开,而其他目录则展开。

不用说,我不太擅长 bash,非常感谢任何帮助!

./backup_system.sh 
+ home=
+ home='"/home/ravas/Documents/*",'
+ home='"/home/ravas/Documents/*","/home/ravas/Downloads/*",'
+ home='"/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*",'
+ home='"/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*","/home/ravas/pCloudLocal/*",'
+ home='"/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*","/home/ravas/pCloudLocal/*","/home/ravas.old/*"'
+ echo '"/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*","/home/ravas/pCloudLocal/*","/home/ravas.old/*"'
"/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*","/home/ravas/pCloudLocal/*","/home/ravas.old/*"
+ sudo rsync -aAXv /
'--exclude="/home/ravas/Documents/*","/home/ravas/Downloads/*","/home/ravas/pCloudDrive/*","/home/ravas/pCloudLocal/*","/home/ravas.old/*"'
'--exclude=/dev/*' '--exclude=/proc/*' '--exclude=/sys/*' '--exclude=/tmp/*' '--exclude=/run/*' '--exclude=/mnt/*' '--exclude=/media/*' --exclude=/lost+found** /run/media/ravas/system_backup

最佳答案

基本问题是 bash 在您的命令中解析各种内容的顺序对于您要执行的操作来说都是错误的。具体来说,它解析(并应用和删除)引号和转义符,然后扩展 {this,that,theother} 列表,然后扩展变量引用(如 $home)。最终结果是,当 $home 扩展为以逗号分隔的引用元素列表时,无论是引号还是逗号都无法发挥预期效果。

像往常一样,在这种情况下,数组是处理这种情况的最佳方式:

homearray=()
homearray+=("/home/ravas/Documents/*")
homearray+=("/home/ravas/Downloads/*")
homearray+=("/home/ravas/pCloudDrive/*")
homearray+=("/home/ravas/pCloudLocal/*")
homearray+=("/home/ravas.old/*")
# Alternate short form:
# homearray=(/home/ravas/{Documents,Downloads,pCloudDrive,pCloudLocal}/"*" "/home/ravas.old/*")
sudo rsync -aAXv / "${homearray[@]/#/--exclude=}" --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /run/media/ravas/system_backup

解释:"${homearray[@]/#/--exclude=}" 做了三件事;首先,[@] 使其扩展到数组的所有元素;然后 /#/--exclude= 用“--exclude=”“替换”每个元素的开头(本质上,它在每个元素前面加上“--exclude=”),最后它周围的双引号防止通配符 ("*") 扩展和造成严重破坏。

关于Bash:需要帮助将变量传递给 rsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50710476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com