微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在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
问题是缺少
cat_a_file_with_spaces.run
a file with spaces
周围的引号。如何获得Z shell以保持正确的报价? 谢谢     

解决方法

        尝试
run cat ${(q)filename_with_spaces}
。这就是(q)修饰符的用途。与运行脚本相同:
echo -E ${(q)@} >> $filename
。它不是bash,您不需要在变量周围加上引号:除非您指定了某些选项(不记得确切地是哪个)
command $var
无论
$var
是什么,总是将唯一的一个参数传递给exactly13ѭ。为了确保某些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
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。