내가 이렇게 하면:
SUMAN_DEBUG=foo echo $SUMAN_DEBUG
아무런 출력도 얻지 못해요
하지만 이렇게 하면:
SUMAN_DEBUG=foo && echo $SUMAN_DEBUG
그러면 나는 얻는다
"부자"
왜 그런 겁니까?
답변1
[이 답변은 올바르지 않습니다. 문제는 명령줄에서 변수를 할당하기 전에 발생하는 변수 확장으로 인해 발생합니다. 아래 댓글을 참조하세요. 또한 이 질문은 중복으로 선언되었으며 원래 질문에서 잘 논의되었습니다. -gt]
SUMAN_DEBUG=foo
앞에 오는 명령에만 존재하는 지역 변수에 대한 지역 환경 변수 할당입니다. 두 번째 경우에는 &&
명령 목록이 실행되었기 때문에 명령이 없습니다 . 귀하의 경우 첫 번째 명령은 비어 있고(따라서 환경 변수는 명령에 영향을 미치지 않음) 두 번째 명령은 실행되지만 환경 변수에 대해 설정되지 않습니다.
export
변수가 전역 환경 변수가 되도록 할당에 추가할 수 있습니다 . 그러나 명령 목록이 완료된 후에도 지속됩니다.
또 다른 옵션은 전체 명령 목록을 괄호 안에 넣어 하위 쉘에서 실행하는 것입니다.
(export SUMAN_DEBUG=foo && echo $SUMAN_DEBUG)
이 경우 영구 환경 변수는 서브셸에 설정되며, 서브셸이 작업을 완료하면 환경이 사라집니다.
보다Bourneagain 쉘 매뉴얼, 부품 목록 및 정보환경더 알아보기.
답변2
명령줄에서는 ;
또는 로 명령을 구분 해야 합니다 &&
. 공백은 CLI 명령의 구분 기호가 아닙니다.
첫 번째 명령이 성공적으로 종료되면(종료 코드 0) &&
두 번째 명령이 실행됩니다.
;
두 번째 명령은 첫 번째 명령의 종료 상태에 관계없이 실행됩니다.
시험:
# a1;echo hello
bash: a1: command not found
hello
# a1 && echo hello
bash: a1: command not found
스크립트에서 첫 번째와 두 번째 명령은 \n
bash에서도 인식되는 개행 문자로 구분됩니다.