zsh - 如何在 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

问题是 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/

相关文章:

zsh - 这是什么意思 >> ~/.zshrc?

zsh - 如何在 ZSH 中编辑路径变量

git - 完整路径的 zsh 主题 + 显示 git 更改

python - zsh:/usr/local/bin/pipenv:错误的解释器:/usr/local/opt/python/bin/python3.7:没有这样的文件或目录

autocomplete - zsh 自动完成 anaconda 环境

terminal - 如何从终端删除 Powerlevel9k?

shell - Zsh - 使用点运算符时按空格拆分字符串

shell - 删除字符串中的换行符

zsh - 在 zsh 中执行任何命令时出现 jsonpath 错误

zsh - 自定义 Powerlevel10k 提示