我有一个脚本,文件名中有一个字符串,如下所示:
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 spaces
周围的引号在 cat_a_file_with_spaces.run
不见了。你如何让 Z shell 保持正确的引用?谢谢
最佳答案
尝试
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\"
)不是正确的引用:文件名可以包含除 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
关于zsh - 如何在 zsh 中引用文件名中的字符串(传递回其他脚本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6348387/