Mec*_*cki 5 shell xcode sh xcode10
从 Xcode 10 开始,构建脚本阶段可以使用文件列表 ( .xcfilelist) 进行输入和输出,而不是直接指定输入/输出文件。这些文件似乎支持注释(WWDC 示例在顶部显示了命令行注释)、空行(也在示例中),并且希望每行一个文件路径。如果这些文件包含构建设置(例如$(SRCROOT)),它们会在调用脚本之前展开,就像如果文件路径直接作为输入/输出文件被提供一样,它们会被展开。
这听起来是一个很棒的功能,但是您将如何在实际脚本中使用这些文件列表?
当直接指定文件时,你有 shell 变量SCRIPT_INPUT_FILE_COUNT,SCRIPT_OUTPUT_FILE_COUNT然后是每个输入/输出文件的一个变量,命名SCRIPT_INPUT_FILE_#和SCRIPT_OUTPUT_FILE_#位置#曾经是一个向上计数的数字。假设您有相同数量的输入/输出文件,此脚本将打印所有文件:
#!/bin/sh
: $((i=0))
while [ $i -lt "$SCRIPT_INPUT_FILE_COUNT" ]
do
eval fileIn="\$SCRIPT_INPUT_FILE_${i}"
eval fileOut="\$SCRIPT_OUTPUT_FILE_${i}"
echo "$fileIn --> $fileOut"
: $((i=i+1))
done
Run Code Online (Sandbox Code Playgroud)
这是一个干净的 POSIX 兼容 shell 脚本,是的,你可以在需要时让它更好,bash但上面的代码应该适用于每个sh兼容的 shell(它在使用#!/bin/sh和 not时也承诺#!/bin/bash)。
但是当使用文件列表时,它SCRIPT_INPUT_FILE_COUNT是 0。相反,你得到SCRIPT_INPUT_FILE_LIST_COUNTandSCRIPT_OUTPUT_FILE_LIST_COUNT和变量SCRIPT_INPUT_FILE_LIST_#and SCRIPT_OUTPUT_FILE_LIST_#,包含预处理文件列表的路径,其中所有注释和空行都已被删除,所有构建设置都已展开。
现在,我将如何在我的脚本中使用这些文件列表?上面的小示例脚本如何使用 Xcode 中的文件列表生成相同的输出?我不是很擅长 shell 脚本,我正在寻找一个干净的解决方案,它不需要任何其他脚本解释器,但sh.
我不知道有什么方法可以访问 shellscript 中的文件列表本身。然而,文件列表的想法是,无论有多少文件,您都最好拥有一个文件列表。因此,我通常将其硬编码为我给 xcode 的相同值。它有点重复,但不是很多:
set -e
while read file; do
EXPANDED=`eval echo "$file"`
echo "do something with $EXPANDED"
done <"${SRCROOT}/path/to/files.xcfileslist"
Run Code Online (Sandbox Code Playgroud)
作为该设备的副作用,read我们去除空白并进行一些其他光处理。如果您特别想知道如何发生这种情况,请参阅此答案。
我相信大多数(全部?)构建设置都作为环境变量导出到脚本中。因此,通过在这里评估它们,eval我们扩展了它们。
使用eval开启了恶意文件列表执行代码的可能性。然后,它可能与您正在执行的构建脚本位于同一位置,所以我不确定这是一个非常实际的问题。其他 shell 有更安全的方法来解决这个问题,但我不知道有任何适用于普通sh和默认 macOS 的方法。