zsh:命令替换,正确引用和反斜杠(再次)

时间:2015-04-20 09:48:05

标签: zsh

(注意:这是我的帖子zsh: Command substitution and proper quoting的后续问题,但现在有了额外的复杂功能)。

我有一个函数_iwpath_helper,它输出到stdout一个可能包含空格的路径。为了便于讨论,我们假设_iwpath_helper总是返回一个常量文本,例如

function _iwpath_helper
{
    echo "home/rovf/my directory with spaces"
} 

我还有一个函数quote_stripped需要一个参数,如果这个参数被引号括起来,它会删除它们并返回剩余的文本。如果参数未被引号括起,则返回它不变。这是它的定义:

function quote_stripped 
{
    echo ${1//[\"\']/}
}

现在我按以下方式组合这两个函数:

target=$(quote_stripped "${(q)$(_iwpath_helper)}")

(当然," quote_stripped'在这个玩具示例中是不必要的,因为_iwpath_helper在这里没有返回引号分隔的路径,但在实际应用中,它有时会这样做。) / p>

现在的问题是变量目标包含真正的反斜杠字符,即如果我做了

echo +++$target+++

我看到了

+++home/rovf/my\ directory\ with\ spaces

如果我尝试

cd $target

我的系统出现了错误消息,即目录

home/rovf/my/ directory/ with/ spaces

不存在。

(如果你想知道正斜杠的来源:我在Cygwin上运行,我想cd命令只是在这种情况下将反斜杠解释为正斜杠,以便更好地适应Windows环境)

我猜实际出现在变量 target 中的反斜杠是由我应用于$(_ iwpath_helper)的(q)扩展标志引起的。我现在的问题是我不能简单地删除(q),因为没有它,函数quote_stripped只会在参数$ 1上获得字符串的第一部分,直到第一个空格( / home / rovf / my )。

我怎样才能正确写出来?

2 个答案:

答案 0 :(得分:1)

我认为您只是想避免尝试手动删除引号,并使用(Q)扩展标记。比较:

% v="a b c d"
% echo "$v"
a b c d
% echo "${(q)v}"
a\ b\ c\ d
% echo "${(Q)${(q)v}}"
a b c d

答案 1 :(得分:0)

chepner是对的:我尝试取消引用该字符串的方式很愚蠢(我在" Bourne Shell方式中思考太多"),我应该使用(Q)标志。

这是我的解决方案:

target="${(Q)$(_iwpath_helper)}"

不再需要quote_stripped函数....

相关问题