如何解决如何在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 举报,一经查实,本站将立刻删除。