저는 bash 스크립트를 사용하여 CLI에서 자동화된 테스트를 수행하고 있습니다. 갑자기 작동하지 않는 것 같습니다. 우리 개발자들이 운영 체제를 일부 변경한 것 같습니다.
내가 본 오류는
bash-3.2$ sh cli-unit.sh
cli-unit.sh: line 53: syntax error near unexpected token `('
cli-unit.sh: line 53: ` if ! diff < (echo "$EXPECTED") < (echo "$FOUND") > /dev/null; then'
코드 부분은
runTest() {
local TITLE="$1"
local BODY="$2"
COUNTER=$((COUNTER + 1))
local SHELL=$(getShell "$BODY")
local EXPECTED=$(getOutput "$BODY")
local FOUND=$(eval "$SHELL")
if ! diff <(echo "$EXPECTED") <(echo "$FOUND") > /dev/null; then
echo "--- FAIL: $TITLE"
diff <(echo "$EXPECTED") <(echo "$FOUND")
return 1
fi
PASSED=$((PASSED + 1))
return 0
}
누군가 이 문제를 변경/수정하도록 도와줄 수 있나요? 나는 그것을 고칠 수 없다. 미리 감사드립니다.
답변1
귀하의 스크립트는 분명히 bash
스크립트이지만 sh
.
명시적으로 sh
스크립트를 시작하는 대신
- 사용
bash
하거나 - 스크립트를 실행 가능하게 만들고 첫 번째 줄
#!
에bash
인터프리터를 가리키는 적절한 -line을 추가한 다음 를 사용하여 스크립트를 실행합니다./cli-unit.sh
.
sh
쉘은 특정 bash
쉘 구문을 이해할 것으로 기대할 수 없습니다.
귀하가 보여준 스크립트의 내용에 대해 몇 가지 추가 질문이 있습니다.
- 실수로 시스템 환경 변수와 충돌하지 않도록 소문자 쉘 변수 이름을 사용하십시오. 코드에서는
SHELL
현재 셸의 인터프리터에 대한 경로(일반적으로 경로)를 설정합니다 . diff
문자열 비교에는 사용하지 마십시오 . 불평등을 테스트 하십시오if [ "$variable1" != "$variable2" ]
.printf
가변 데이터를 출력하는 대신 사용합니다echo
("왜 printf가 echo보다 나은가요?").
해결하다 diff
:
if [ "$FOUND" != "$EXPECTED" ]; then
# code as before
return 1
fi
# code as before
return 0
지점 내에서는 if
계속 diff
사용할 수 있습니다.전시하다차이점(특히 다른 스크립트나 사용자의 경우예상하다이 스크립트의 출력). 또 다른 옵션은 다음과 같습니다
if [ "$FOUND" != "$EXPECTED" ]; then
# $FOUND is different from $EXPECTED
printf 'FAIL (%s): Found: %s\n' "$TITLE" "$FOUND"
printf 'FAIL (%s): Expected: %s\n' "$TITLE" "$EXPECTED"
# other code here
fi
# rest of script
또는 그런 것.