내 문제는 스크립트 코딩을 시작했을 때 여러 변수 범위 문제가 발생하여 거의 모든 변수를 내보내는 나쁜 습관이 발생했다는 것입니다.
이제 내 코드가 상당히 커졌으므로 정리를 고려 중이었고 그 중 일부는 쓸모 없는 내보내기를 제거하는 것이었습니다. 불행히도 변수 범위에 대한 지식이 완전한지 확실하지 않습니다. 주제에 대해 몇 페이지를 읽은 후에도 마찬가지입니다.
내가 아는 것(그리고 그것이 맞기를 바랍니다):
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