시스템을 실행하기 위해 원격 서버의 Jenkins에서 실행할 스크립트를 작성하려고 합니다. 시스템은 확장자로 구별되는 다양한 형식의 파일을 가져올 수 있습니다. 우리 resources
는 하위 디렉토리에 다양한 형식의 테스트 데이터를 가지고 있습니다.
resources/datasetA/datasetA.format1
resources/datasetB/datasetB.format1
resources/datasetC/datasetC.format2
etc.
일반적으로 데이터 세트 디렉터리와 추가 하위 디렉터리에는 다른 파일이 있습니다.
위에 나열된 가져오기 소스 파일을 선택하려고 하는데 운이 없습니다.
내 초기 생각은
for dir in $(ls -d resources/*/)
do
dataset=$(echo ${dir%/} | xargs basename)
source=$(ls resources/$dataset/$dataset.*)
.
.
.
done
로컬 컴퓨터의 cygwin 창에 이것을 입력하면 제대로 작동하지만 ls resources/$dataset/$dataset.*
여러 파일이 반환되는 것처럼 보이는 원격 컴퓨터에서는 실패합니다. 디렉토리 내용은 로컬 및 원격 시스템에서 동일하며 왜 이런 일이 발생하는지 이해할 수 없습니다.
그런 다음 resources/$dataset의 모든 파일을 나열하고 $dataset와 일치하는 기본 이름 확장자가 없는 마지막 파일을 식별합니다.
for dir in $(ls -d resources/*/)
do
dataset=$(echo ${dir%/} | xargs basename)
find resources/$dataset -maxdepth 1 -type f | while read fnm
do
baseFnm=$(basename $fnm)
if [ ${baseFnm%.*} = $dataset ]
then
source=$fnm
fi
done
# Exercise the system using $source
done
하지만 source
사용하려고 하면 비어 있습니다. if
구조에 추적을 추가하고 테스트가 성공하는지 확인할 수 있기 때문에 이에 대해 매우 혼란스럽습니다.
두려워할 것은 없습니다. 테스트가 성공하면 루프에서 벗어나려고 시도하지만 이 경우에는 fnm
비어 있습니다.
돕다!
답변1
일반적으로 출력을 구문 분석하는 것은 좋지 않습니다 ls
.
아마도 다음이 도움이 될까요?
for d in resources/*/
do
rn=${d%/};rn=${rn##*/}
for f in "$d$rn."*
do
[ -f "$f" ] && printf '%s\n' "$f"
done
done
Jenkins와 원격 시스템을 사용하고 있다고 언급하셨습니다. 문제의 가장 큰 원인은 따옴표, 특히 달러 기호가 누락되었기 때문입니다. 이 스크립트를 어떻게 호출하나요?