내 문제는 스크립트 작성을 시작했을 때 여러 변수 범위 지정 문제에 부딪혀 거의 모든 변수를 내보내는 나쁜 습관이 생겼다는 것입니다.
이제 내 코드가 상당히 커졌으므로 정리를 고려하고 있으며 그 중 일부는 쓸모 없는 내보내기를 제거하는 것입니다. 안타깝게도 변수 범위에 대한 이해가 완전하지 않습니다. 주제에 대해 몇 페이지를 읽은 후에도 마찬가지입니다.
내가 아는 것(정확하길 바랍니다):
1-변수를 내보내서 하위 쉘 프로세스에서 해당 내용을 사용할 수 있도록 합니다.
export myvar="content"
2- 이와 같이 괄호 안에 수행된 작업은 내보내기를 제거하면 영향을 받습니다(내가 아는 한 이것이 하위 쉘을 선언/사용하는 유일한 방법입니다).
$(grep "content" <<< $myvar)
3- 범위를 설정하지 않고 선언된 변수는 전역 변수입니다.
myvar="content"
4- 지역 변수를 선언하지 않았으므로 함수에 문제가 발생할까 걱정할 필요가 없습니다.
local myvar="i don't use this"
질문:
1-내 코드가 뚜렷한 초보자 분위기를 내지 않는다는 사실을 제외하면 쓸모없는 내보내기를 계속 제거하는 데 의미가 있습니까?
2- 이 작업을 계속할 경우 영향을 받아 코드가 손상될 수 있다는 점을 알아야 할 다른 사항이 있습니까? 아니면 내 지식이 잘못되었거나 불완전합니까?
3- 잘 작성된(그리고 완전한) 변수 범위 참조를 알고 있다면 링크를 공유해 주세요.
답변1
이중 평가를 사용하지 않는 한 export
내보낸 변수에 영향을 주지 않고 모든 내보내기를 제거할 수 있습니다. 두 가지 평가란 다음을 의미합니다.
var1=var2
export "${var1}=var3"
echo "$var2"
var3
대신 다음을 사용하세요.
set -a
...스크립트 상단에 있습니다. 이후에 정의된 모든 변수는 자동으로 적용됩니다 . 여기에는 이전에 편집하지 않은 변수도 exported
포함됩니다 . export
또는 set -a
스크립트의 일부를 사용하여 set +a
설정을 해제할 수도 있습니다. 이는 함수로도 작동합니다.
그러나 서브쉘은 어쨌든 변수 값을 자동으로 상속하므로 다음과 같습니다.
var1=value
( echo "$(echo "$var1")" )
value
export
이 경우에는 차이가 없습니다.
그러나 스크립트가 편집한 값을 해석하는 다른 스크립트나 다른 실행 파일을 호출 export
하고 해당 호출을 중지하면 export
해당 환경에서 해당 값을 더 이상 사용할 수 없습니다. 다음 예에서는 $PS1
대화형 쉘 프롬프트의 내용을 정의하는 쉘 변수를 사용하여 export
ed 변수에 대한 변경 사항이 하위 프로세스에 어떤 영향을 미치는지 보여줍니다.
export PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i
###OUTPUT###
this is another executable
> exit
exit
하지만...
PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i
###OUTPUT###
sh-4.3$ exit
exit
하지만 프로세스를 호출할 때 명시적으로 환경 변수를 선언하면...
PS1="$(printf "this is another executable\n > ")"
{
echo exit | PS1=$PS1 sh -i
echo exit | sh -i
}
###OUTPUT###
this is another executable
> exit
exit
sh-4.3$ exit
exit