Java bash脚本出错";出口代码126“;

Java bash脚本出错";出口代码126“;,java,objective-c,ios,xcode,bash,Java,Objective C,Ios,Xcode,Bash,我想将CPD(复制粘贴检测)集成到我的iOS项目中。我读到了这篇文章,然后写了下来 要在我使用bash脚本的代码中自动确定CopyPaste,请执行以下操作: 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}/

我想将CPD(复制粘贴检测)集成到我的iOS项目中。我读到了这篇文章,然后写了下来

要在我使用bash脚本的代码中自动确定CopyPaste,请执行以下操作:

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”。这是日志副本 我从这里取了密码 出现错误,然后我注释此字符串:

${BUILT_PRODUCTS_DIR} -cpd-xml "${FULL_PATH_TO_CPD_XML_OUTPUT}"
我试图找到关于这个错误的任何信息,但只发现了其中一些问题没有答案。我对bash脚本一无所知。我很乐意接受任何建议。 谢谢你的关注

以下脚本的作者:

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

126表示“命令不可执行”

看起来$build\u PRODUCTS\u DIR}不可执行
你能用这个变量的值更新吗?请像pastebin中的错误消息所说的那样,
${builded\u PRODUCTS\u DIR}
的值是一个目录(第314行)。尝试执行目录没有任何意义,因此生成脚本似乎已损坏或损坏


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

问题出在错误的脚本中。我给出了一个修改后的脚本,已添加哪些日志:

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}"

以下是

的源代码。该错误也可能是由于运行Shell的“权限”不足而导致的。 我得到:-

bash:/home/XXX.sh:权限被拒绝
退出状态:126


在修复shell脚本的权限时,问题得到了解决。

不幸的是,我对bash脚本一无所知。我添加了此脚本作者的话。实际上,您的应用程序没有bash shell的权限来运行$build\u PRODUCTS\u DIR}。如何操作将取决于您从项目复制的代码。我会试着看一看,但我不知道目标C(假设这就是目标C)。如果我弄明白了,我会更新。我在尝试为Docker构建时遇到了此问题。感谢您的修复。
chmod+x foo.sh
允许执行,如果您有任何名为
D
E
B
U
G
,无引号的
[DEBUG]
将被解释为通配符并扩展为这些文件的列表(也取决于某些shell选项),明显的修复方法是引用字符串。另请参见
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}"