쉘 스크립트를 실행하는 다양한 방법

쉘 스크립트를 실행하는 다양한 방법

스크립트를 실행하는 방법에는 여러 가지가 있습니다. 내가 아는 것은:

/path/to/script # using the path (absolute or relative)
. script        # using the . (dot)
source script   # using the `source` command

다른 방법이 있나요? 그들 사이의 차이점은 무엇입니까? 다른 것 대신에 하나를 사용해야 하는 상황이 있습니까?

답변1

또 다른 방법은 인터프리터를 호출하여 스크립트 경로를 전달하는 것입니다.

/bin/sh /path/to/script

포인트와 소스는 동일합니다. (편집: 아니요, 그렇지 않습니다. KeithB가 다른 답변에 대한 설명에서 지적했듯이 "."는 bash 관련 쉘에만 적용되며 "source"는 bash 및 csh 관련 쉘에 적용됩니다.) -place ( 거기에 스크립트를 복사하여 붙여넣은 것과 같습니다.) 이는 스크립트의 모든 함수와 비지역 변수가 보존된다는 의미입니다. 이는 또한 스크립트가 디렉토리에 CD를 저장하는 경우 작업이 완료되어도 여전히 그 위치에 있을 것임을 의미합니다.

스크립트를 실행하는 다른 방법은 자체 하위 쉘에서 실행하는 것입니다. 완료 후에는 스크립트의 변수가 더 이상 유효하지 않습니다. 스크립트가 디렉터리를 변경하더라도 호출 환경에는 영향을 주지 않습니다.

/path/to/script 및 /bin/sh 스크립트는 약간 다릅니다. 일반적으로 스크립트 시작 부분에 다음과 같이 "shebang"이 있습니다.

#! /bin/bash

이는 스크립트 인터프리터의 경로입니다. 실행 시 지정한 것과 다른 인터프리터를 지정하면 다르게 동작할 수 있습니다(또는 전혀 작동하지 않을 수 있습니다).

예를 들어 Perl 스크립트와 Ruby 스크립트는 다음으로 시작합니다.

#! /bin/perl

그리고

#! /bin/ruby

를 실행하여 이러한 스크립트 중 하나를 실행하면 /bin/sh script전혀 작동하지 않습니다.

Ubuntu는 실제로 bash 쉘을 사용하지 않지만 dash라는 매우 유사한 쉘을 사용합니다. bash가 필요한 스크립트는 /bin/sh script방금 대시 해석기를 사용하여 bash 스크립트를 호출했기 때문에 do를 통해 호출하면 약간 잘못될 수 있습니다.

스크립트를 직접 호출하는 것과 스크립트 경로를 인터프리터에 전달하는 것의 또 다른 작은 차이점은 스크립트를 인터프리터에 경로를 전달하여 실행하는 대신 직접 실행할 수 있도록 실행 가능으로 표시해야 한다는 것입니다.

또 다른 작은 변화: 스크립트를 실행하는 모든 메서드에 대해 eval을 접두사로 사용할 수 있습니다.

eval sh script
eval script
eval . script

등. 실제로는 아무것도 바뀌지 않지만 철저하게 포함하고 싶었습니다.

답변2

대부분의 사람들은 다음을 추가하여 쉘 스크립트를 디버그합니다.디버그 플래그스크립트에:

set -x     # Print command traces before executing command.
set -v     # Prints shell input lines as they are read.
set -xv    # Or do both

하지만 이는 편집기를 사용하여 파일을 열고(파일 편집 권한이 있다고 가정) 다음과 같은 줄을 추가하고 set -x파일을 저장한 다음 파일을 실행해야 함을 의미합니다. 그런 다음 완료되면 동일한 단계를 수행하고 삭제 set -x등을 수행해야 합니다. 이것은 지루할 수 있습니다.

이 모든 작업을 수행하는 대신 명령줄에서 디버그 플래그를 설정할 수 있습니다.

$ bash -x ~/bin/ducks
+ du -cks -x dir1 dir2 dir3 file1 file2 file3
+ sort -n
+ tail .ducks
123 etc
424 bin
796 total



$ sh -xv ~/bin/ducks  
#!/usr/bin/env bash

# Find the disk hog
# Borrowed from http://oreilly.com/pub/h/15
...
...

답변3

Shawn J. Goff는 많은 좋은 점을 지적하지만 전체 이야기를 포함하지는 않습니다.

Ubuntu는 실제로 bash 쉘을 사용하지 않지만 dash라는 매우 유사한 쉘을 사용합니다. bash가 필요한 스크립트는 /bin/sh방금 대시 해석기를 사용하여 bash 스크립트를 호출했기 때문에 스크립트를 통해 호출할 때 약간의 오류가 발생할 수 있습니다.

많은 시스템 스크립트(예: init.d, /etc 등)에는 실제로 다른 쉘(과거 및 현재 모두)에 대한 기호 링크인 #!/bin/shshebang 이 있습니다 . 그러나 그 중 하나가 으로 호출되면 다르게 동작합니다. 즉, POSIX 호환 모드를 준수합니다./bin/sh/bin/bash/bin/dash/bin/sh

그들은 이것을 어떻게 하는가? 글쎄, 그들은 어떻게 불리는지 확인합니다.

쉘스크립트 자체가 어떻게 호출되는지 테스트하고 상황에 따라 다른 작업을 수행할 수 있나요? 예, 그럴 수 있습니다. 그래서 당신이 그것을 부르는 방식은 항상 다른 결과로 이어질 것이지만, 물론 그것이 당신을 짜증나게 하는 경우는 거의 없습니다. :)

경험상: bash와 같은 특정 쉘을 배우고 bash 튜토리얼에서 명령을 작성하는 경우 달리 명시하지 않는 한 #!/bin/bash제목을 대신 입력하십시오 #!/bin/sh. 그렇지 않으면 명령이 실패할 수 있습니다. 스크립트를 직접 작성하지 않았다면 쉘( , )을 추측하기보다는 직접( , ) ./foo.sh호출 하세요 . shebang은 올바른 쉘을 호출해야 합니다.bar/foo.shsh foo.shsh bar/foo.sh

여기에는 두 가지 다른 호출이 있습니다.

cat foo.sh | dash
dash < foo.sh

답변4

sh script
bash script

더 있으면 어떨까 생각중인데...

.그리고 source그것은 동일합니다. 실행 후에는 환경에 대한 모든 변경 사항이 script유지됩니다. 일반적으로 이 라이브러리는 다양한 스크립트에서 재사용될 수 있도록 Bash 라이브러리를 얻는 데 사용됩니다.

이는 현재 디렉터리를 보존하는 좋은 방법이기도 합니다. 스크립트에서 디렉터리를 변경하면 스크립트를 실행하는 셸에는 변경 내용이 적용되지 않습니다. 그러나 이것을 사용하여 실행하면 스크립트가 종료된 후에도 현재 디렉터리가 유지됩니다.

관련 정보