인형을 위한 Bash Shebang?

인형을 위한 Bash Shebang?

주로 사용하는 설정이 있는 bash 스크립트가 있습니다.

#!/bin/bash

하지만 나는 정기적으로 다음과 같은 것을 발견합니다.

#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex

등등.

누군가 이러한 shebang 옵션의 의미와 이점, 그리고 다른 shebang에도 적용되는지 여부를 설명할 수 있습니까?

답변1

스크립트가 /path/to/foo로 시작하는 경우 #!/bin/bash실행은 /path/to/foo arg1 arg2실행과 동일합니다 /bin/bash /path/too/foo arg1 arg2. Shebang 라인이 이면 #!/bin/bash -ex실행하는 것과 같습니다 /bin/bash -ex /path/too/foo arg1 arg2. 이 기능은 커널에 의해 관리됩니다.

Shebang 라인에는 하나의 인수만 이식 가능하다는 점에 유의하십시오. 일부 유닉스(예: Linux)는 하나의 인수만 허용하므로 bash는 두 개의 인수 및 가 아닌 #!/bin/bash -e -x단일 5자 인수(구문 오류)를 수신하게 됩니다 .-e -x-e-x

Bourne 쉘 sh및 POSIX sh, bash, ksh 및 zsh와 같은 파생 쉘의 경우:

  • -e이는 명령이 실패하면(0이 아닌 상태를 반환하여 이를 나타냄) 스크립트가 즉시 종료된다는 것을 의미합니다.
  • -x쉘이 실행 추적을 인쇄하도록 합니다.

다른 프로그램에서는 이러한 옵션을 이해할 수 있지만 의미는 다릅니다.

답변2

bash자세한 내용을 확인하기 위해 전달된 옵션입니다 help set. 이 경우에는 다음과 같습니다.

-x  Print commands and their arguments as they are executed.
-e  Exit immediately if a command exits with a non-zero status.

답변3

나는 더 나은 – 더 나은 이식성 – 대안을 언급하고 싶습니다:

#!/usr/bin/env bash

위의 예에서는 실행 파일을 env찾는 데 사용 bash하지만 항상 /bin/bash. 오래된 #!/bin/bash스크립트는 작동하지 않습니다닉스OS, 예를 들어.

위에서 설명한 대로 사용하는 경우 (내가 아는 한) to env와 같은 인수를 제공할 수 없습니다 . 하지만 대신 이렇게 할 수 있습니다:-ebash

#!/usr/bin/env bash
set -e

답변4

를 사용하여 스크립트를 시작 하거나 을 실행하는 것은 해당 줄 바로 뒤에 스크립트를 삽입하는 것과 동일한 효과를 갖습니다 .#! /path/to/bash -optionbash -option /path/to/scriptset -option#!

set -x본질적으로 디버깅만을 위한 것입니다. 당신은 그것이 정상적으로 남아 있기를 원하지 않을 것입니다.

의 효과는 set -e매뉴얼에서 제시하는 것보다 훨씬 더 복잡합니다. 보다 정확한 설명은 대략 다음과 같습니다.

을 호출한 후 set -e,테스트되지 않은명령이 0이 아닌 상태로 종료되면 쉘이 해당 종료 상태로 종료됩니다.

내가 말하다더 정확하게아직 매우 모호하기 때문입니다. 명령이 고려되는 상황 목록테스트를 거쳤습니다.신비롭고 예측하기 어렵다. 정확한 규칙은 쉘마다 다르며 동일한 쉘의 버전 간에도 변경됩니다.

set -e하다~ 아니다명령의 종료 상태가 0이 아닌 경우 Bash가 종료되도록 합니다.

  • if~ 사이에있는 ; 또는elifthen
  • while~ 사이에있는 ; 또는untildo
  • 다음 !; 또는
  • 그 뒤에는 ||or &&또는 &( &해당 waitor가 fg실패할 수도 있음); 또는
  • 가 적용되지 |않는 한 뒤에 가 옵니다 . set -o pipefail또는
  • $( ... )명령의 일부로 사용되는 경우 내부 (기본 할당 및/또는 리디렉션이 아닙니다. 즉, 실패 foo=$( bar )하면 실패 bar하지만 local foo=$( bar )실패하지는 않습니다); 또는
  • 위의 사항이 적용되는 복합 명령 내에서; 또는
  • 위의 내용이 적용되는 어느 곳에서나 호출되는 쉘 함수 내부.

복합 명령과 쉘 기능에 대한 효과는 재귀적입니다.

셸 자체는 0이 아닌 상태로 종료되므로 효과가 하위 셸 외부로 전파될 수 있습니다.

!반전된 종료 상태가 무시되는 경우에도 예외가 적용됩니다 .

반대로 set -e트리거됩니다.그 밖의 모든"실패"를 의미하는지 아니면 단순히 "거짓"을 의미하는지에 관계없이 0이 아닌 상태입니다. 예를 들어 처음에 0일 ((x++))때 0이 아닌 "실패" 종료 상태를 갖습니다 x.

set -e너무 복잡하기 때문에 모든 명령을 명시적으로 확인하는 것을 피해야 한다는 학설이 있습니다 .

또는 계속 사용하려면 그룹 앞에 set -e적어야 합니다 .!((arithmetic))

관련 정보