我想写一个shell脚本,调用另一个脚本,然后执行一个rsync命令。 第二个脚本应该在自己的terminal中运行,所以我使用gnome-terminal -e "..."
命令。 这个脚本的参数之一是一个包含应该给rsync的参数的string。 我把这些单引号。 直到这里,一切正常,直到其中一个rsync参数是一个包含空格的目录path。 我尝试了很多',',','的组合,但是脚本根本不运行,或者只有path的第一部分被采用。
这是我使用的代码的一个稍微修改版本
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'\''' "
在Backup.sh
中运行这个命令
rsync $5 "$path"
目的地$path
从Stamp
文本计算。
我怎样才能达到这三个层次的嵌套报价?
这些是我刚才看到的一些问题(我也尝试了其他的资源)
我没有成功地将解决scheme应用于我的问题。
这是一个例子。 caller.sh
使用gnome-terminal
来执行foo.sh
,然后打印所有参数,然后用第一个参数调用rsync
。
caller.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"
编辑:如果$1
包含rsync的几个参数,其中一些是长路径,以上将不起作用,因为bash通过"$1"
作为一个参数,或$1
作为多个参数,拆分它,而不考虑包含引号。
有(至少)一个解决方法,你可以欺骗bash如下:
caller2.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"
的输入。
警告 :这个黑客引入了一个安全漏洞,如果用户对字符串内容有任何影响(例如'--option1 --option2 \"long path\"; echo YOU HAVE BEEN OWNED'
将运行rsync
,然后执行 echo
命令)。
您是否尝试用“\”(不包括引号)来避开路径中的空间?
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''' "