如何在 zsh 中包装多个选项字符串

How to wrap a multiple options string in zsh

我有多个 bash 脚本可以使用 rsync 传输文件。 它们是 mirror.sh、move.sh、copy.sh。 我希望他们分享一些基本的通用 rsync 选项。

copy.sh:

#!/bin/zsh

rsync_basic_option=$(~/loadrc/bashrc/rsync_basic_option.sh)
echo "rsync_basic_option --> $rsync_basic_option"

rsync \
    "$rsync_basic_option" \
    "$source/" "$target/"

rsync_basic_option.sh:

#!/bin/zsh

echo \
    -aHSv \
    --progress \
    --force \
    --append-verify \

在 运行 之后:

./copy.sh ~/loadrc/ ~/loadrc.bak/

我得到以下错误输出:

rsync_basic_option --> -aHSv --progress --force --append-verify
rsync: -aHSv --progress --force --append-verify: unknown option
rsync error: syntax or usage error (code 1) at main.c(1766) [client=3.2.3]

如何实现? 一种替代方法是使用 eval。 我可以包装一个长的 COMMAND 字符串,然后用

调用它
    eval "$COMMAND"

如果不正确请修复我:我觉得eval的用法很危险,有bug。 如果“$COMMAND”或“$source”、“$target”中有任何space,它会导致意想不到的结果。 所以,我不想使用 eval。

我找到的一个解决方案是:

copy.sh:

#!/bin/zsh

source=
target=

. ~/loadrc/bashrc/rsync_basic_option.sh

rsync \
    "${rsync_basic_option[@]}" \
    "$source/" "$target/"

rsync_basic_option.sh:

#!/bin/zsh

rsync_basic_option=(
    -aHSv \
        --progress \
        --force \
        --append-verify \
    )

它似乎有效,到目前为止一切顺利,这是实现此目标的最佳方法吗?

基于假设在当前 rsync_basic_options.sh 文件中没有任何其他命令或变量赋值的轻微变化:

$ cat rsync_basic_options
-aHSv
--progress
--force
--append-verify

然后有几个选项可以将它们加载到数组中;想到的一对:

$ ro=( $(< rsync_basic_options) )       # might be problematic if dealing with embedded white space

# or

$ mapfile -t ro < rsync_basic_options

这两个都使用以下内容填充 ro[] 数组:

$ typeset -p ro
declare -a ro=([0]="-aHSv" [1]="--progress" [2]="--force" [3]="--append-verify")

然后可以像这样在脚本中使用:

rsync "${ro[@]}" "$source/" "$target/"