如何在 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/"
我有多个 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/"