명령이 다르게 동작하기 전에 기본값으로 변수를 설정합니까?

명령이 다르게 동작하기 전에 기본값으로 변수를 설정합니까?

대체 기본값으로 변수를 설정하는 것은 유효합니다.후속주문하다:

$ unset APP_ENV
$ echo $APP_ENV

$ APP_ENV="${APP_ENV:-production}"; echo $APP_ENV
production
$ APP_ENV=staging
$ APP_ENV="${APP_ENV:-production}"; echo $APP_ENV
staging

그러나 변수를 설정해보십시오직전이를 사용하는 명령은 다르게 동작합니다.

$ unset APP_ENV
$ echo $APP_ENV

$ APP_ENV="${APP_ENV:-production}" echo $APP_ENV

$ APP_ENV=staging
$ APP_ENV="${APP_ENV:-production}" echo $APP_ENV
staging

두 번째 예가 다르게 동작하는 이유는 무엇입니까?

답변1

첫 번째 버전을 더 명확하게 만들기 위해 세미콜론을 개행 문자로 바꾸겠습니다.

APP_ENV="${APP_ENV:-production}"
echo $APP_ENV

라인 1은 쉘이 라인 2를 보기 전에 완전히 실행됩니다.

1행에서는 $APP_ENV설정이 와 같습니다 production.

2행에서는 변수에 액세스하고 해당 값을 echo명령에 제공합니다.

이제 단일 명령 버전은 다음과 같습니다.

APP_ENV="${APP_ENV:-production}" echo $APP_ENV

먼저, 쉘은 매개변수 확장 및 (이 경우에는 적용되지 않음) 다른 대체 유형을 기반으로 명령줄을 확장합니다. 현재 값이 $APP_ENV비어 있으므로 다음과 같이 확장됩니다.

APP_ENV="${:-production}" echo

확장이 수행된 후 이 명령 호출에만 사용 $APP_ENV되도록 변수를 설정 하고 해당 값으로 호출합니다. 그러나 환경에 환경 변수가 있는 것에 대해서는 신경 쓰지 않습니다 . 아무것도 포함하지 않은 명령줄만 살펴봅니다. 그래서 에코가 없습니다.productionecho ""echo$APP_ENV

$APP_ENV이 경우 실제로 설정되었음을 증명하는 방법은 다음과 같습니다 .

$ APP_ENV="${APP_ENV:-production}" env |grep APP_ENV
APP_ENV=production

요약하자면, 매개변수 확장이 너무 빨리 발생하기 때문에 두 번째 예에서는 상상한 대로 작동하지 않습니다.

답변2

;변수가 초기화된 후 a가 누락되었기 때문에 두 번째 형식은 다르게 동작합니다.

APP_ENV="${APP_ENV:-production}" echo $APP_ENV

해야 한다:

APP_ENV="${APP_ENV:-production}"; echo $APP_ENV
                                ^ semicolon that's missing

먼저 문제를 해결한 다음 질문을 다시 작성하세요.

관련 정보