在 Xcode 的 运行 脚本构建阶段使用 bash glob
Using a bash glob in a Run Script build phase in Xcode
我有一个 Xcode 项目,其构建阶段会复制一些文件。假设我想将所有 rtf 文件从 [项目目录]/foo/bar 复制到 [项目目录]/bar/foo。我会使用这样的命令:
cp -v foo/bar/*.rtf bar/foo/
在终端中执行此操作完全符合我的预期:foo/bar 中的所有 rtf 文件都被复制到 bar/foo。但是在构建时,我从 cp:
得到一个构建错误
Cp: foo/bar/*.rtf: No such file or directory
cp
似乎找不到文件。就好像 bash 没有扩展通配符一样。我知道当脚本 运行s 时我在正确的目录中,因为我在 cp
之前有 运行 pwd
并且它给出了我所期望的。我已经将脚本阶段的 Shell 设置为 /bin/bash。我究竟做错了什么?我不能在 运行 脚本构建阶段使用 glob 吗?如果是,为什么?
更新: 我 found out 你可以像这样在 bash 中关闭 globbing:
set -o noglob
然后像这样重新打开它:
set +o noglob
和 see all bash options and their status 像这样:
set -o
我尝试在我的 运行 脚本阶段使用后者,它显示 noglob
被禁用。所以 noglob
不是这里的问题。
可以通过查看构建日志中的构建脚本执行来揭示问题(按构建脚本行右侧的图标),您会看到 Xcode 运行s脚本为:
/bin/sh -c \"cp -v foo/bar/*.rtf bar/foo/\"
和通配在引号或双引号中不起作用。
我通常会编写脚本来执行此类操作,而 运行 则相反。因此,在 .xcodeproj
旁边创建一个 tools
文件夹,并在该脚本中写入复制指令 (tools/copy_pdf_files.sh
):
#!/bin/sh
cp -v foo/bar/*.rtf bar/foo/
使其在命令提示符下可执行:
cd /path/to/project
chmod +x tools/copy_pdf_files.sh
然后 运行 改为:
${PROJECT_DIR}/tools/copy_pdf_files.sh
我在没有意识到的情况下将 cp
参数的路径放在双引号内,并且通配在引号中不起作用。问题已解决。
我有一个 Xcode 项目,其构建阶段会复制一些文件。假设我想将所有 rtf 文件从 [项目目录]/foo/bar 复制到 [项目目录]/bar/foo。我会使用这样的命令:
cp -v foo/bar/*.rtf bar/foo/
在终端中执行此操作完全符合我的预期:foo/bar 中的所有 rtf 文件都被复制到 bar/foo。但是在构建时,我从 cp:
得到一个构建错误Cp: foo/bar/*.rtf: No such file or directory
cp
似乎找不到文件。就好像 bash 没有扩展通配符一样。我知道当脚本 运行s 时我在正确的目录中,因为我在 cp
之前有 运行 pwd
并且它给出了我所期望的。我已经将脚本阶段的 Shell 设置为 /bin/bash。我究竟做错了什么?我不能在 运行 脚本构建阶段使用 glob 吗?如果是,为什么?
更新: 我 found out 你可以像这样在 bash 中关闭 globbing:
set -o noglob
然后像这样重新打开它:
set +o noglob
和 see all bash options and their status 像这样:
set -o
我尝试在我的 运行 脚本阶段使用后者,它显示 noglob
被禁用。所以 noglob
不是这里的问题。
可以通过查看构建日志中的构建脚本执行来揭示问题(按构建脚本行右侧的图标),您会看到 Xcode 运行s脚本为:
/bin/sh -c \"cp -v foo/bar/*.rtf bar/foo/\"
和通配在引号或双引号中不起作用。
我通常会编写脚本来执行此类操作,而 运行 则相反。因此,在 .xcodeproj
旁边创建一个 tools
文件夹,并在该脚本中写入复制指令 (tools/copy_pdf_files.sh
):
#!/bin/sh
cp -v foo/bar/*.rtf bar/foo/
使其在命令提示符下可执行:
cd /path/to/project
chmod +x tools/copy_pdf_files.sh
然后 运行 改为:
${PROJECT_DIR}/tools/copy_pdf_files.sh
我在没有意识到的情况下将 cp
参数的路径放在双引号内,并且通配在引号中不起作用。问题已解决。