Jenkins에서 이 명령을 실행 중이며 sh를 사용합니다. 하지만 내 bash 스크립트에서 이 오류가 무엇을 의미하는지 잘 모르겠습니다.
#! /bin/sh
for d in $(ls -d kube/xx/bb/!(abc*|!cdf*)/ | xargs -I {} basename {} ) ;do echo $d; done
test.sh: command substitution: line 3: syntax error near unexpected
token `(' test.sh: command substitution: line 3:
`ls -d kube/xx/bb/!(abc*|!cdf*)/ | xargs -I {} basename {} )'
답변1
/bin/sh
일반적으로 이러한 패턴을 이해하지 못하는 셸 에서 실행되는 스크립트에서 확장된 글로빙 패턴을 사용하려고 합니다 .
또는 (각 쉘에서 적절한 옵션 설정) 과 bash
같이 이러한 모드를 이해하는 쉘로 전환하거나 다음과 같이 이를 이해하는 것을 사용하십시오 .ksh
zsh
/bin/sh
find
#!/bin/sh
find kube/xx/bb -prune ! -name 'abc*' ! -name 'cdf*' -type d -exec basename {} \;
또는 GNU를 사용하는 경우 find
:
#!/bin/sh
find kube/xx/bb -prune ! -name 'abc*' ! -name 'cdf*' -type d -printf '%f\n'
!
두 예 모두에서 질문의 앞부분이 오타라고 가정합니다 .cdf*
임의로 복잡한 명령을 실행하기 위해 xargs
파이프라인에서처럼 find
완벽 find
하게 사용 가능한 조건자를 실행 해야 하는 경우는 거의 없습니다 .-exec
반품,왜 `ls`를 구문 분석하지 *않나요*(그리고 어떻게 수행합니까)?
더 많은 수동 접근 방식:
#!/bin/sh
for pathname in kube/xx/bb/*/; do
[ -d "$pathname" ] || continue
name=${pathname%/}
name=${name#kube/xx/bb/}
case $name in
abc*|cdf*) continue ;;
esac
printf '%s\n' "$name"
done