bash脚本出错“退出代码126”

时间:2012-04-02 15:33:13

标签: java objective-c ios xcode bash

我想将CPD(复制粘贴检测)集成到我的iOS项目中。我读到了herehere

要在代码中自动确定CopyPaste,我正在使用bash脚本:

echo "Checking files in ${SOURCE_ROOT}"
JARS_DIR=${PROJECT_DIR}/CPD
FULL_PATH_TO_CPD_XML_OUTPUT=${PROJECT_DIR}/cpd-output.xml

# Running CPD
java -classpath "${JARS_DIR}/ObjCLanguage-0.0.5-SNAPSHOT.jar:${JARS_DIR}/pmd.jar" net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 --files "${SOURCE_ROOT}" -v --language ObjectiveC --encoding UTF-8 --format net.sourceforge.pmd.cpd.XMLRenderer > "${FULL_PATH_TO_CPD_XML_OUTPUT}"

# Running self :)
${BUILT_PRODUCTS_DIR} -cpd-xml "${FULL_PATH_TO_CPD_XML_OUTPUT}"

该代码创建cpd-output.xml文件。但是在编译时带错了“Command / bin / sh失败,退出代码为126”。这是日志副本http://pastebin.com/359k1Wni 我从这个example project中获取了代码 错误发生,然后我评论这个字符串:

${BUILT_PRODUCTS_DIR} -cpd-xml "${FULL_PATH_TO_CPD_XML_OUTPUT}"

我试图找到有关此错误的信息,但只发现了一些没有答案的问题。我对bash脚本没什么了解。任何建议我都会很满意。 谢谢你的关注。

P.S。写下脚本的作者:

  

为了集成XCode和CPD,我们将添加到Build   通常,阶段以项目“运行脚本”阶段为目标   由几部分组成:实际上调用cpd解析   cpd-output.xml以“正确格式”输出

3 个答案:

答案 0 :(得分:7)

  

126表示“命令不可执行"

# Running self :)
${BUILT_PRODUCTS_DIR} -cpd-xml "${FULL_PATH_TO_CPD_XML_OUTPUT}"

看起来$ BUILT_PRODUCTS_DIR}不可执行 你能用这个var的值来更新吗

答案 1 :(得分:2)

与pastebin中的错误消息一样,${BUILT_PRODUCTS_DIR}的值是一个目录(第314行)。尝试执行目录没有任何意义,因此构建脚本似乎已损坏或损坏。

顺便问一下,setenv命令是脚本的一部分吗?这通常是csh命令,而不是shbash命令。但据我所知,执行目录在tcsh下也没有意义。

答案 2 :(得分:0)

问题在于错误的脚本。我给出了一个修改后的脚本,其中添加了以下日志:

echo "Checking files in ${SOURCE_ROOT}"
CPD_DIR=${PROJECT_DIR}/CPD
JARS_DIR=${PROJECT_DIR}/CPD
FULL_PATH_TO_CPD_XML_OUTPUT=${PROJECT_DIR}/cpd-output.xml
OBJC_JAR_LIBRARY=${JARS_DIR}/ObjCLanguage-0.0.5-SNAPSHOT.jar

echo [DEBUG] CPD_DIR = ${CPD_DIR}
echo [DEBUG] JARS_DIR = ${JARS_DIR}
echo [DEBUG] FULL_PATH_TO_CPD_XML_OUTPUT = ${FULL_PATH_TO_CPD_XML_OUTPUT}
echo [DEBUG] OBJC_JAR_LIBRARY = ${OBJC_JAR_LIBRARY}
echo [DEBUG] SOURCE_ROOT = ${SOURCE_ROOT}

# Running CPD
java -classpath "${OBJC_JAR_LIBRARY}:${JARS_DIR}/pmd.jar" net.sourceforge.pmd.cpd.CPD --minimum-tokens 200 --files "${SOURCE_ROOT}" -v --language ObjectiveC --encoding UTF-8 --format net.sourceforge.pmd.cpd.XMLRenderer > "${FULL_PATH_TO_CPD_XML_OUTPUT}"

CPD_EXECUTABLE="${CPD_DIR}/CPDObjective-C"
if [ ! -f "${CPD_EXECUTABLE}" ];
then
echo "CPD executable file is not found: " ${CPD_EXECUTABLE}
fi
echo "Running ${CPD_EXECUTABLE} -cpd-xml ${FULL_PATH_TO_CPD_XML_OUTPUT}"
"${CPD_EXECUTABLE}" -cpd-xml "${FULL_PATH_TO_CPD_XML_OUTPUT}"

以下是sample Copy-Paste-Detect

的源代码