Drupal의 drush 명령줄 인터페이스 출력에서 bash 명령을 실행하고 싶습니다. drush site-alias
먼저 그룹 이름을 표시한 다음 그룹의 각 사이트를 표시하는 웹 루트 목록을 반환합니다. 웹사이트 자체는 별칭으로 되어 있습니다 group.site
. 예를 들어, 다음과 같은 결과를 얻을 수 있습니다.
내부 내부.사이트1 내부.사이트2 외부 외부.사이트1 외부.사이트2 마케팅 마케팅.사이트1 마케팅.사이트2
그룹 별칭 자체가 아닌 각 사이트 별칭에서 명령을 실행하고 싶습니다. 문자열에 마침표가 있는지 테스트해야 하며, 그렇다면 다음을 실행하세요.
for i in $(drush site-alias); do {if no period) drush $i command; done;
이 테스트를 어떻게 실행할 수 있나요?
답변1
패턴 일치를 사용할 수 있습니다.
for i in $(drush site-alias) ; do
if [[ $i == *.* ]] ; then
drush "$i" command
fi
done
답변2
$i
POSIX와 유사한 쉘의 경우 다음과 같은 경우 명령을 실행한다고 가정하십시오 .아니요예제에서 볼 수 있듯이 마침표를 포함하여 다음과 같이 작성할 수 있습니다.
case $i in
(*.*) ;; # contains "."s, do nothing
(*) drush "$i" command;;
esac
따옴표 가 $(drush site-alias)
없으면 분할+glob이 수행됩니다. 원하는 분할은 $IFS
기본적으로 문자(공백, 탭 및 줄 바꿈(zsh의 NUL 포함))에서 수행되는 반면, 원하지 않는 와일드카드는 단어 /*
를 /
.
GNU 시스템에서 GNU 쉘(bash)과 같은 Ksh 스타일 프로세스 교체를 지원하는 쉘을 사용하면 명령 출력이 다음과 같다고 가정합니다.사이트 별칭각 줄에 대해 다음을 수행할 수 있습니다.
xargs -rd '\n' -a <(drush site-alias | grep -vF .) -I@ drush @ command
여기에는 몇 가지 장점이 있습니다.
- 와일드카드 없음
- 무슨 일이
$IFS
있어도 개행 문자와 개행 문자에서만 올바르게 분할됩니다. - 전체 출력을 메모리에 저장하지 말고 콘텐츠 출력이 시작
drush
되는 즉시 명령을 실행하십시오.drush site-alias
- 어느 하나라도 실패하면 해당 실패가 의 종료 상태
drush command
에 반영됩니다 .xargs
모든 실패는 drush site-alias
여전히 무시됩니다.
이를 통해 zsh
다음을 수행할 수 있습니다.
autoload zargs
site_aliases=( ${(f)"$(drush site-alias)"} ) || exit
zargs -I@ -- ${site_aliases:#*.*} -- drush @ command
어디:
- 또한
f
매개변수 확장 플래그를 사용하여 개행에서만 분할합니다(빈 행은 삭제됩니다). - 실패를 처리합니다
drush site-alias
(여기에서는 종료 스크립트를 통해). ${site_aliases:#*.*}
필터나가M
( 필터에 매개변수 확장 플래그 추가존재하다대신) 요소가 포함되어 있습니다..
- 마찬가지로 및 명령이 실패
xargs
하면zargs
실패한 종료 상태가 반환됩니다.
답변3
패턴 교체 확장을 통해 이 작업을 수행할 수 있습니다.
for i in $(drush site-alias); do
if [ -z "${i//[^.]/}" ]; then
# no period
drush "$i" command
fi
done
예, 인용했습니다 "$i"
. 이것은 아마도 가능하다면 해야 할 일일 것입니다. 그렇게 하면 놀라움을 피할 수 있을 것입니다. 이 경우에는 중요하지 않습니다.
답변4
또 다른 독립적인 답변을 위해 다음을 사용하는 것이 좋습니다.쉘 매개변수 확장.
for i in $(drush site-alias)
do
if [[ ${i%.*} == $i ]]
then
drush $i command
fi
done