【问题标题】:In the zsh shell, why can't I pass multiple arguments to a positional parameter?在 zsh shell 中,为什么我不能将多个参数传递给位置参数?
【发布时间】:2020-12-26 21:06:33
【问题描述】:

我最近开始学习 C++。我一直在 zsh shell 中使用 clang 来编译我的代码。 为此,我每次都使用相同的命令,所以我把它做成了一个 .zsh 文件来简化流程。

我文件中的代码是这样的:

clang++ $1 -std=c++17 -stdlib=libc++ -o $2

它适用于单个 .cpp 文件;即,如果我通过它file.cpp output,它会完全按照我的意愿工作。但是,如果我将多个文件传递给它,clang 会抱怨(它说路径无效)。

如果我输入以下内容,clang 会完全按照我的意愿进行操作,并将多个文件编译成一个名为“test”的 UNIX 可执行文件。

clang++ multiple.cpp add.cpp input.cpp -std=c++17 -stdlib=libc++ -o test

但是,如果我输入以下内容,它就会抱怨。我也尝试过转义空格,但没有成功。

zsh ../comp.zsh 'multiple.cpp add.cpp input.cpp' attempt

我不明白为什么这不起作用并且在其他地方找不到任何答案。我对zsh很陌生。

提前致谢!

【问题讨论】:

  • 'multiple.cpp add.cpp input.cpp' 因为这是引用的,所以它是一个包含空格字符的参数,而不是由空格分隔的多个参数。
  • 我不是 zsh 用户,但我猜 multiple.cpp add.cpp input.cpp 将作为单个命令行参数传递给 clang++?
  • 我建议你了解make或类似的工具。
  • @G.M.正确的;默认情况下,zsh对不带引号的参数扩展执行分词,这与 POSIX 规范相反。

标签: zsh macos-big-sur


【解决方案1】:

我想通了,感谢Code-ApprenticeG.M.multiple.cpp add.cpp input.cpp 作为单个参数传递给clang++。

我将代码更改为: clang++ $@[0,-2] -std=c++17 -stdlib=libc++ -o $@[-1],这样除了最后一个参数之外的所有参数都作为输入文件单独传递给clang++,最后一个参数作为输出文件传递。

【讨论】:

  • 您也可以使用${=1} 代替$@[0,-2] 来强制将值拆分为空格。
  • 谢谢,这很有用!
猜你喜欢
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 2019-09-08
  • 2020-08-28
  • 1970-01-01
  • 2014-01-21
  • 2011-05-30
相关资源
最近更新 更多