bash for 루프에서 임시 환경 변수를 사용하는 방법은 무엇입니까?

bash for 루프에서 임시 환경 변수를 사용하는 방법은 무엇입니까?

YII_ENV=prod yii kw/test열 번 달리고 싶어요 . 나는 노력했다

$ YII_ENV=prod for x in 1..10 do; yii kw/test done;
-bash: for: command not found
1304682651

(한 번은 실행해본 것 같습니다.) 저도 시도해 봤습니다.

$ for x in {1..10} do; YII_ENV=prod yii kw/test done;
-bash: syntax error near unexpected token `YII_ENV=prod'

GNU bash, 버전 4.3.39(2)-릴리스(i686-pc-cygwin)

답변1

명령 기간 동안 환경 변수를 설정하는 구문은 명령이 간단한 명령인 경우에만 작동합니다(보다 정확하게는 유사하게 작동하는 외부 명령 또는 내장 명령 - 참조).VARIABLE=VALUE COMMAND필드 분할을 위해 언제 임시 IFS를 사용할 수 있습니까?자세한 내용은). for 루프와 같은 복잡한 명령과 함께 사용할 수 없습니다.

첫 번째 시도는 for명령의 첫 번째 단어가 아니기 때문에 실패하므로 키워드로 구문 분석되지 않으므로 bash는 forfor 루프를 구문 분석하는 대신 호출된 명령을 찾습니다. 두 번째 시도는 루프의 간단한 구문 오류로 인해 실패합니다. 앞에 세미콜론이나 개행 문자가 필요합니다 . 그렇지 않으면 키워드로 인식되지 않기 do때문입니다 . do또한 앞에는 세미콜론이 필요합니다 done.

for x in {1..10}; do YII_ENV=prod yii kw/test; done

루프 중에 변수를 설정하려면 이전 값을 덮어쓰는 것이 중요하지 않은 경우 변수를 설정하고 나중에 설정을 해제하면 됩니다.

export YII_ENV=prod
for x in {1..10}; do yii kw/test; done
unset YII_ENV

또는 하위 쉘에서 루프를 실행하십시오. 루프가 쉘 환경을 수정해서는 안 되는 경우에만 이 옵션을 사용하십시오.

(
  export YII_ENV=prod
  for x in {1..10}; do yii kw/test; done
)

또는 함수 내에서 루프를 실행하고 변수를 함수에 로컬로 만듭니다. 이를 위해서는 bash, ksh 또는 zsh가 필요하며 이는 일반 sh에서는 작동하지 않지만 {...}구문에는 어쨌든 그러한 요구 사항이 있습니다.

call_yii () {
  typeset YII_ENV=prod
  export YII_ENV
  for x in {1..10}; do yii kw/test; done
}

답변2

먼저 명령 구문을 수정하여 세미콜론을 올바르게 배치하세요. 바꾸다:

for x in 1..10 do; yii kw/test done;

사용(올바른 중괄호 확장 추가):

for x in {1..10}; do yii kw/test; done

그런 다음 변수를 추가합니다.

for x in {1..10}; do YII_ENV=prod yii kw/test; done

관련 정보