bash double引号double Quotes BSD

发布于 2025-01-18 15:39:20 字数 684 浏览 1 评论 0原文

类似线程:

如何逃脱双引号引号?

我有一个带有GNU bash的FreeBSD盒,版本4.4.0(0)-Release。

在此框中,有一个运行rsync的shell脚本,该脚本需要指定一个带有空间的Rsync路径参数。

dqt ='“”'

rsync =“/usr/usr/local/bin/rsync -avzn -rsync -path = $ {dqt} sudo rsync $ {dqt}”

解释器是bash,但只是为了确保我已经尝试使用bash -x,这就是我得到的:

+/usr/local/bin/rsync -avzn'-rsync-path =“ sudo'rsync “' - 数字-IDS - DELETE ...

当然会导致rsync错误:语法或用法错误。任何想法如何解决此问题?

运行rsync fine as:

rsync-path =“ sudo rsync”

Similar thread:

How can I escape a double quote inside double quotes?

I have a freebsd box with GNU bash, version 4.4.0(0)-release.

On this box there is a shell script running rsync, this script needs to specify an rsync path parameter which has space inside it.

dqt='"'

RSYNC="/usr/local/bin/rsync -avzn --rsync-path=${dqt}sudo rsync${dqt}"

The interpreter is bash but just to make sure I have tried it with specifically bash -x and here is what I get:

+ /usr/local/bin/rsync -avzn '--rsync-path="sudo' 'rsync"' --numeric-ids --delete ...

Which of course going to lead to rsync error: syntax or usage error. Any ideas how to fix this?

Run rsync fine as:

rsync-path="sudo rsync"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

五里雾 2025-01-25 15:39:20

您的rsync命令似乎是单词分解的。您不能将完整命令存储在变量中,您必须使用一个数组:

RSYNC_ARR=( /usr/local/bin/rsync -avzn --rsync-path="sudo rsync" )

"${RSYNC_ARR[@]}" # the double quotes are mandatory here

一个小测试才能查看差异:

#!/bin/bash

RSYNC='/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'

RSYNC_ARR=( /usr/local/bin/rsync -avzn --rsync-path=sudo\ rsync )

set -x

: $RSYNC
#+ : /usr/local/bin/rsync -avzn '--rsync-path="sudo' 'rsync"'

: ${RSYNC_ARR[@]}
#+ : /usr/local/bin/rsync -avzn --rsync-path=sudo rsync

: "$RSYNC"
#+ : '/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'

: "${RSYNC_ARR[@]}"
#+ : /usr/local/bin/rsync -avzn '--rsync-path=sudo rsync'

Your rsync command seems to have been word-split. You can't store a full command in a variable, you have to use an array:

RSYNC_ARR=( /usr/local/bin/rsync -avzn --rsync-path="sudo rsync" )

"${RSYNC_ARR[@]}" # the double quotes are mandatory here

A little test to see the difference:

#!/bin/bash

RSYNC='/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'

RSYNC_ARR=( /usr/local/bin/rsync -avzn --rsync-path=sudo\ rsync )

set -x

: $RSYNC
#+ : /usr/local/bin/rsync -avzn '--rsync-path="sudo' 'rsync"'

: ${RSYNC_ARR[@]}
#+ : /usr/local/bin/rsync -avzn --rsync-path=sudo rsync

: "$RSYNC"
#+ : '/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'

: "${RSYNC_ARR[@]}"
#+ : /usr/local/bin/rsync -avzn '--rsync-path=sudo rsync'
合约呢 2025-01-25 15:39:20

您必须将报价从双引号更改为单个引号,例如:

RSYNC="/usr/local/bin/rsync -avzn --rsync-path="'"sudo rsync"'

我在一个小bash脚本中使用了此内容:

#!/bin/bash -x

RSYNC="/usr/local/bin/rsync -avzn --rsync-path="'"sudo rsync"'
echo "#" $RSYNC "#"

eval "$RSYNC"

结果:

+ RSYNC='/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'
+ echo '#' /usr/local/bin/rsync -avzn '--rsync-path="sudo' 'rsync"' '#'
# /usr/local/bin/rsync -avzn --rsync-path="sudo rsync" #
+ eval '/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'
++ /usr/local/bin/rsync -avzn '--rsync-path=sudo rsync'
./x: line 6: /usr/local/bin/rsync: No such file or directory

好吧,我没有 /usr /local bin中的rsync,但是您可以看到最后一个参数-rsync-path = sudo rsync被包含在单个引号中,因此单个芳香

You have to change the quoting from double quoted to single quoted, like:

RSYNC="/usr/local/bin/rsync -avzn --rsync-path="'"sudo rsync"'

I've used this in a small bash script:

#!/bin/bash -x

RSYNC="/usr/local/bin/rsync -avzn --rsync-path="'"sudo rsync"'
echo "#" $RSYNC "#"

eval "$RSYNC"

with the result:

+ RSYNC='/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'
+ echo '#' /usr/local/bin/rsync -avzn '--rsync-path="sudo' 'rsync"' '#'
# /usr/local/bin/rsync -avzn --rsync-path="sudo rsync" #
+ eval '/usr/local/bin/rsync -avzn --rsync-path="sudo rsync"'
++ /usr/local/bin/rsync -avzn '--rsync-path=sudo rsync'
./x: line 6: /usr/local/bin/rsync: No such file or directory

OK, I don't have an rsync in /usr/local bin, but you can see that the last argument, --rsync-path=sudo rsync is enclosed in single quotes and thus a single arument,

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文