我正在尝试编写一个 shell 脚本来调用另一个脚本,然后执行 rsync 命令。
第二个脚本应该在它自己的终端中运行,所以我使用gnome-terminal -e "..."
命令。该脚本的参数之一是一个字符串,其中包含应提供给 rsync 的参数。我把它们放在单引号中。
到目前为止,一切都工作正常,直到 rsync 参数之一是包含空格的目录路径。我尝试了“、”、\“、\”的多种组合,但脚本要么根本不运行,要么只采用路径的第一部分。
这是我正在使用的代码的稍作修改的版本
gnome-terminal -t 'Rsync scheduled backup' -e "nice -10 /Scripts/BackupScript/Backup.sh 0 0 '/Scripts/BackupScript/Stamp' '/Scripts/BackupScript/test' '--dry-run -g -o -p -t -R -u --inplace --delete -r -l '\''/media/MyAndroid/Internal storage'\''' "
Within Backup.sh
运行此命令
rsync $5 "$path"
目的地在哪里$path
根据中的文本计算Stamp
.
如何实现这三层嵌套引用?
这些是我刚才看到的一些问题(我之前也尝试过其他来源)
- https://unix.stackexchange.com/questions/23347/wrapping-a-command-that-includes-single-and-double-quotes-for-another-command https://unix.stackexchange.com/questions/23347/wrapping-a-command-that-includes-single-and-double-quotes-for-another-command
- 如何使嵌套双引号在 bash 解释器中幸存下来? https://stackoverflow.com/questions/6270882/how-to-make-nested-double-quotes-survive-the-bash-interpreter
- 在 bash 中使用多层引号 https://stackoverflow.com/questions/8757163/using-multiple-layers-of-quotes-in-bash
- 嵌套引号 bash https://stackoverflow.com/questions/18880901/nested-quotes-bash
我未能成功地将解决方案应用于我的问题。
这是一个例子。caller.sh
uses gnome-terminal
执行foo.sh
,依次打印所有参数,然后调用rsync
与第一个参数。
来电者.sh:
#!/bin/bash
gnome-terminal -t "TEST" -e "./foo.sh 'long path' arg2 arg3"
foo.sh:
#!/bin/bash
echo $# arguments
for i; do # same as: for i in "$@"; do
echo "$i"
done
rsync "$1" "some other path"
Edit: If $1
包含 rsync 的几个参数,其中一些是长路径,上面的方法不起作用,因为 bash 要么通过"$1"
作为一个参数,或者$1
作为多个参数,将其拆分而不考虑包含的引号。
有(至少)一种解决方法,您可以按如下方式欺骗 bash:
来电者2.sh:
#!/bin/bash
gnome-terminal -t "TEST" -e "./foo.sh '--option1 --option2 \"long path\"' arg2 arg3"
foo2.sh:
#!/bin/bash
rsync_command="rsync $1"
eval "$rsync_command"
这相当于输入rsync --option1 --option2 "long path"
在命令行上。
WARNING:此黑客行为引入了一个安全漏洞,$1
如果用户对字符串内容有任何影响(例如'--option1 --option2 \"long path\"; echo YOU HAVE BEEN OWNED'
会跑rsync
进而execute the echo
命令)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)