웹사이트 검색

Bash에서 소싱과 포크의 차이점 알아보기


이 글의 주요 초점은 bash에서 스크립트와 소스 스크립트를 실행할 때 어떤 일이 발생하는지 명확하게 이해하는 것입니다. 먼저, 다양한 방식으로 스크립트를 호출할 때 프로그램이 어떻게 제출되는지 명확하게 이해하겠습니다.

참고: 확장자를 사용하여 스크립트를 생성하는 것은 중요하지 않습니다. 확장 기능이 없어도 스크립트는 정상적으로 실행됩니다.

기본적으로 모든 스크립트는 shebang(#!)이라는 줄로 시작됩니다. Bash의 해시 기호는 주석으로 해석되지만 shebang에는 특별한 의미가 있습니다. 이는 shebang에서 언급한 통역사로 프로그램을 제출하도록 bash에 지시합니다.

다음은 샘플 프로그램이며 bash를 통역사로 지정하고 있습니다.

cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"

chmod +x Hello_world.sh

이제 스크립트를 실행하려면 두 가지 방법으로 실행할 수 있습니다.

  • 상대 경로를 사용하여 스크립트를 호출합니다. 스크립트가 있는 디렉터리로 이동하여 ./Hello_world.sh를 실행합니다.
  • 스크립트를 호출하려면 절대 경로를 사용하십시오. 파일 시스템의 어느 곳에서나 스크립트의 전체 경로를 입력하십시오.
./Hello_world.sh
pwd
/home/karthick/Hello_world

이제 shebang 없이 프로그램을 제출하려고 하면 어떤 일이 발생하는지 살펴보겠습니다. shebang이 없으면 프로그램은 실행 중인 현재 쉘에 제출됩니다. 제 경우에는 Bash(/bin/bash).

예를 들어 보겠습니다. shebang 없이 Python 스크립트를 만들고 있는데 프로그램을 호출하면 bash는 이 프로그램을 Python 인터프리터에 제출해야 한다는 사실을 모르고 대신 프로그램을 실행합니다. 현재 쉘에서.

cat > run-py.py
echo $SHELL
print("Hello world")

chmod +x run-py.py
./run-py.py

이 경우 제출해야 할 통역사를 언급하여 프로그램을 호출하거나 항상 권장되는 shebang 줄을 추가하면 됩니다.

which python3
$(which python3) /home/karthick/run_py.py

이제 스크립트를 호출하는 방법을 알았으므로 다음 단계는 스크립트를 호출할 때 어떤 일이 발생하는지 이해하는 것입니다. 위의 예에 표시된 대로 스크립트를 호출하면 하위 프로세스가 생성되고(포크) 스크립트가 하위 프로세스에 제출됩니다. 다음 명령을 실행하고 스크립트가 하위 프로세스에 제출되었음을 보여주는 샘플 스크립트를 실행했습니다.

ps -ef --forest | grep -i bash

스크립트의 일부로 여러 하위 프로세스가 있을 수 있으며 이는 코드에 따라 다릅니다. 첨자에 의해 생성된 환경 변수는 완료되면 삭제됩니다. 하위 프로세스는 상위 프로세스에서 생성된 변수를 내보내 액세스할 수 있습니다. 그러나 상위 프로세스는 하위 프로세스에서 생성된 변수에 접근할 수 없습니다.

변수가 작동하는 방식과 변수를 내보내는 방법에 대해 자세히 알아보려면 아래 문서를 살펴보세요.

  • 쉘 스크립팅의 'Linux 변수' 이해 및 작성
  • Bash에서 $$와 $BASHPID의 차이점 알아보기

스크립트 소싱

"Source "는 인수로 전달된 파일을 읽고 현재 쉘 환경에서 코드를 실행하는 쉘 내장 명령입니다. 주로 사용하는 적절한 사용 사례는 .bashrc 또는 .bash_profile의 구성을 수정하고 source 명령을 사용하여 변경 사항을 다시 로드하는 것입니다.

type -a source

소스 명령을 실행하는 구문 방식에는 두 가지가 있습니다. 두 가지 구문 중에서 원하는 사람을 선택할 수 있으며 이는 개인 선택입니다.

source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]

소스가 실제로 어떻게 작동하는지 보여드리겠습니다. 두 개의 쉘 스크립트를 작성하겠습니다. 첫 번째 스크립트(Module.sh)에는 일부 변수와 함수가 포함됩니다. 두 번째 스크립트(Main.sh)는 변수를 인쇄하고 함수를 호출합니다.

Module.sh 파일.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo “Function f1 is called”
}

Main.sh 파일.

#!/usr/bin/env bash

echo $VAR1
f1

스크립트에 대한 실행 권한을 설정하고 메인 스크립트 “main.sh ”를 호출합니다. 이제 이 스크립트는 현재 셸 환경에서 f1 함수와 변수 VAR1를 찾으려고 시도하지만 명령을 찾을 수 없어 실패합니다.

bash main.sh

이제 변수와 함수를 현재 쉘 환경에 로드하고 “main.sh ”에서 액세스할 수 있는 스크립트 내에서 소스 명령을 실행해 보겠습니다.

Module.sh 파일.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo "Function f1 is called"
}

Main.sh 파일.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

이제 스크립트를 다시 실행하고 확인하십시오.

bash main.sh

소스bash에서 쉘 스크립트 작성 시 모듈식 프로그래밍 접근 방식을 따르는 데 매우 유용합니다. 코드를 더 작은 모듈로 나눌 수 있으며 많은 프로그램에서 사용할 수 있습니다. 이러한 방식으로 우리는 DRY(반복하지 마세요) 원칙을 따를 수 있습니다.

이것이 바로 이 기사입니다. 우리는 bash에서 소싱과 포크의 차이점을 간략하게 논의했습니다. 기사를 살펴보고 귀중한 피드백을 공유해 주세요.