이 문서의 주요 초점은 스크립트 대 소스를 실행할 때 어떤 일이 발생하는지 명확하게 이해하는 것입니다. 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 없이 파이썬 스크립트를 만들고 있습니다. 프로그램을 호출하면 bash 이 프로그램을 파이썬 인터프리터에 제출해야 한다는 것을 모르고 대신 현재 셸에서 프로그램을 실행합니다.
$ 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
이제 스크립트를 호출하는 방법을 알았으므로 다음 단계는 스크립트를 호출할 때 어떤 일이 발생하는지 이해하는 것입니다. 위의 예와 같이 스크립트를 호출하면 자식 프로세스(forking ) 스크립트는 자식 프로세스에 제출됩니다. 다음 명령을 실행하고 스크립트가 자식 프로세스에 제출되었음을 보여주는 샘플 스크립트를 실행했습니다.
$ ps -ef --forest | grep -i bash
스크립트의 일부로 여러 하위 프로세스가 있을 수 있으며 이는 코드에 따라 다릅니다. 첨자에 의해 생성된 환경 변수는 완료되면 삭제된다는 점에 유의하십시오. 자식 프로세스는 부모 프로세스가 만든 변수를 내보내어 액세스할 수 있습니다. 그러나 부모 프로세스는 자식 프로세스가 생성한 변수에 접근할 수 없습니다.
변수가 작동하는 방식과 변수를 내보내는 방법에 대한 자세한 내용은 아래 기사를 참조하세요.
- 셸 스크립팅에서 'Linux 변수' 이해 및 작성
- Bash에서 $$와 $BASHPID의 차이점 알아보기
스크립트 소싱
“출처 "는 인수로 전달된 파일을 읽고 현재 쉘 환경에서 코드를 실행하는 쉘 내장 명령입니다. 주로 사용하는 적절한 사용 사례는 .bashrc
에서 구성을 수정하는 것입니다. 또는 .bash_profile
소스 명령을 사용하여 변경 사항 다시 로드 .
$ 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에서 소싱과 포크의 차이점에 대해 간략하게 논의했습니다. 기사를 살펴보고 소중한 피드백을 공유해 주세요.