변수에서 내보내기를 제거하면 또 무엇이 깨질 수 있나요?

변수에서 내보내기를 제거하면 또 무엇이 깨질 수 있나요?

내 문제는 스크립트 코딩을 시작했을 때 여러 변수 범위 문제가 발생하여 거의 모든 변수를 내보내는 나쁜 습관이 발생했다는 것입니다.

이제 내 코드가 상당히 커졌으므로 정리를 고려 중이었고 그 중 일부는 쓸모 없는 내보내기를 제거하는 것이었습니다. 불행히도 변수 범위에 대한 지식이 완전한지 확실하지 않습니다. 주제에 대해 몇 페이지를 읽은 후에도 마찬가지입니다.

내가 아는 것(그리고 그것이 맞기를 바랍니다):

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대화형 쉘 프롬프트의 내용을 정의하는 쉘 변수를 사용하여 exported 변수의 변형이 하위 프로세스에 어떤 영향을 미치는지 보여줍니다.

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

관련 정보