如何在zsh中引用文件名中的字符串(传回其他脚本)

时间:2011-06-14 18:41:51

标签: zsh

我有一个脚本,文件名中有一个字符串,如下所示:

filename_with_spaces="a file with spaces"
echo test > "$filename_with_spaces"
test_expect_success "test1: filename with spaces" "
  run cat \"$filename_with_spaces\"
  run grep test \"$filename_with_spaces\"
"

test_expect_success定义为:

test_expect_success () {
  echo "expecting success: $1"
  eval "$2"
}

run定义为:

#!/bin/zsh
# make nice filename removing special characters, replace space with _
filename=`echo $@ | tr ' ' _ | tr -cd 'a-zA-Z0-9_.'`.run
echo "#!/bin/zsh" > $filename
print "$@" >> $filename
chmod +x $filename
./$filename

但是当我运行顶级脚本test_expect_success时......我得到cat_a_file_with_spaces.run

#!/bin/zsh
cat a file with spaces

问题是a file with spacescat_a_file_with_spaces.run周围的引号丢失了。你如何让Z shell保持正确的引用?

由于

1 个答案:

答案 0 :(得分:4)

尝试

run cat ${(q)filename_with_spaces}

。它是为(q)修饰符编写的。对于运行脚本也是如此:

echo -E ${(q)@} >> $filename

。它不是bash,你不需要在变量周围加上引号:除非你指定一些选项(不记得确切)

command $var
无论command中的内容是什么,

始终只将一个参数传递给$var。要确保某些zsh选项不会改变行为,请输入

emulate -L zsh

位于每个脚本的顶部。

请注意,初始变体(run cat \"$filename_with_spaces\"正确引用:filename可以包含除NULL之外的任何字符和用于分隔目录的/${(q)}会照顾它。

更新:我会以下列方式编写test_expect_success函数:

function test_expect_success()
{
    emulate -L zsh
    echo "Expecting success: $1" ; shift
    $@
}

用法:

test_expect_success "Message" run cat $filename_with_spaces