대체 기본값으로 변수를 설정하는 것은 유효합니다.후속주문하다:
$ 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
되도록 변수를 설정 하고 해당 값으로 호출합니다. 그러나 환경에 환경 변수가 있는 것에 대해서는 신경 쓰지 않습니다 . 아무것도 포함하지 않은 명령줄만 살펴봅니다. 그래서 에코가 없습니다.production
echo ""
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
먼저 문제를 해결한 다음 질문을 다시 작성하세요.