对于bug in git,此时git-submodule.sh读取(重新排序):
[iterating over command line arguments]
--reference)
case "$2" in '') usage ;; esac
reference="--reference=$2"
shift
;;
--reference=*)
reference="$1"
shift
;;
[...]
if test -n "$reference"
then
git-clone $quiet "$reference" -n "$url" "$path" --separate-git-dir "$gitdir"
else
git-clone $quiet -n "$url" "$path" --separate-git-dir "$gitdir"
fi ||
die "$(eval_gettext "Clone of '\$url' into submodule path '\$path' failed")"
字符串
这只使用--reference
给出的 last 参数。现在我想增强这一点,以便将所有--reference
选项传递给git-clone
。这对于普通的参数(reference="$reference --reference=$2"
)来说是微不足道的,但是当我想到包含白色、引号或shell Meta字符的参数时,我的头脑会感到难以置信。
什么是避免这种累积争论的最佳实践?
2条答案
按热度按时间hk8txs481#
最佳实践是使用bash数组:
字符串
但是,引用的脚本使用/bin/sh。
gc0ot86w2#
在编写不能使用数组的可移植
#!/bin/sh
时,假设您实际上需要传递任意参数,最佳实践是在将参数中的每个单引号替换为'\''
之后,用单引号('
)字符 Package 每个参数。假设你有一个名为
quote_for_shell
的函数,它允许你接受一个参数并完美地引用它。下面是该函数的最简单的未优化版本:字符串
然后你可以这样做:
型
但诀窍是,你不能只做
git-clone $references
(或git-clone "$references")
-未加引号的变量/命令替换的结果不会被shell完全评估,它们只会对它们进行globbing和字段拆分(带引号的扩展也不会使用这些通道进行评估)。所以你必须把这个命令 Package 在一个
eval
中,但是它**必须是得到eval
'ed的 * 引号 * 扩展,这样eval
就能看到原始的空格和globbing字符,就像它们被转义一样:型
但是等等!同一个命令中的所有其他变量,可能包含任意字符,比如
$url
和$path
,现在也在eval
中结束,所以它们现在也需要被转义:型