스크립트에서 변수를 변경해도 스크립트 외부에서는 변경되지 않는 이유는 무엇입니까?

스크립트에서 변수를 변경해도 스크립트 외부에서는 변경되지 않는 이유는 무엇입니까?

export터미널에 변수가 있다고 가정 해 봅시다 . 그런 다음 해당 변수를 다른 것으로 변경하는 스크립트를 호출합니다. 하지만 터미널과 echo변수로 돌아가면 원래 값으로 유지됩니다.

변수를 변경하고 스크립트 외부뿐만 아니라 스크립트 외부에서도 볼 수 있게 하려면 어떻게 해야 합니까?~에스크립트. 제가 말하고 싶은 내용의 예는 다음과 같습니다.

ares@ares-HP-ProBook-4530s:~$ export package=tree
ares@ares-HP-ProBook-4530s:~$ cat script3.sh 

#! /bin/bash
#set -x
echo $package
apt-cache show $1 | head -1
if [ $? -eq 0 ]; then
    package=1
else
    package=0
fi
echo $package

스크립트 실행 시 출력

ares@ares-HP-ProBook-4530s:~$ ./script3.sh gnome-terminal
tree
Package: gnome-terminal
1
ares@ares-HP-ProBook-4530s:~$ echo $package
tree
ares@ares-HP-ProBook-4530s:~$ 

답변1

쉘 프로세스에는 상위 환경의 사본이 있으며 상위 프로세스 환경에는 전혀 액세스할 수 없습니다. 쉘 프로세스가 종료되면 해당 환경에 대한 모든 변경 사항이 손실됩니다. 스크립트 파일을 소싱하는 것은 셸 환경을 구성하는 데 가장 일반적으로 사용되는 방법입니다. 두 가지 셸 유형 각각에 대해 하나씩 유지하고 싶을 수도 있습니다.

이 답변을 찾았습니다여기

답변2

소스 yourfile.sh

이것은 필요한 작업을 수행해야 합니다.

답변3

또 다른 가능성은 .bashrc에 함수를 생성하고 현재 셸 내에서 해당 함수를 호출하는 것입니다. 이렇게 하면 약간의 타이핑이 절약됩니다. 여전히 변수를 전달할 수 있습니다.

좀 더 유연성이 필요한 경우 별칭 대신 사용하는 방법입니다.

답변4

새로운 프로세스 가져오기복사내보낸 각 변수의

다음 중 하나를 수행해야 합니다.

  • 동일한 프로세스에서 모든 작업을 수행합니다(현재 셸에서 스크립트를 소싱하여).
  • 공통 위치(sqlite, 플랫 파일)에 값을 유지하고 각 프로세스에서 읽기/쓰기

관련 정보