인형을위한 배쉬 셰방?


36

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

#!/bin/bash

하지만 저는 정기적으로

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

등등.

누군가이 세방 옵션의 의미와 이점과 다른 세방에 적용되는지 설명 할 수 있습니까?


이러한 옵션은 Bash (또는 다른 통역사)에 따라 다릅니다. 다른 쉘 (예 : 대시 및 ksh)과 동일 할 수 있지만 AWK 및 Python과 같은 다른 인터프리터에서는 다를 수 있습니다. 통역사가 허용하는 많은 옵션을 사용할 수 있습니다. 옵션은 인터프리터마다 다르며 shebang은 커널 기능입니다.
추후 공지가있을 때까지 일시 중지되었습니다.

답변:


41

스크립트 /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. 이 기능은 커널에 의해 관리됩니다.

(리눅스와 같은) 일부 유닉스 즉, 그래서 단지 하나 개의 인수를 허용 : 당신이 이식 오두막 줄에 하나의 인수를 가질 수 있음을 참고 #!/bin/bash -e -x단일 오 문자 인수 수신 배쉬로 이어질 것입니다 -e -x(구문 오류)가 아닌 두 개의 인수 -e-x.

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

  • -e 즉, 명령이 실패하면 (0이 아닌 상태를 반환하여 표시됨) 스크립트가 즉시 종료됩니다.
  • -x 쉘이 실행 추적을 인쇄하게합니다.

다른 프로그램은 이러한 옵션을 이해하지만 다른 의미를 가질 수 있습니다.


24

이 경우 자세한 정보 를 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
+1 그리고 -ex둘 다
Nifle

그들이 Bash에 전달 된 명령 줄 옵션처럼 보이기 때문에 혼란 스럽습니다.
Caoilte

2
@Caoilte : 그리고 실제로는 (에서 man bash) : In addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...].
cYrus

1
아아! 깜박이고 당신이 그것을 그리워! :).
Caoilte

0

더 이식성이 좋은 대안과 같이 더 나은 방법을 언급하고 싶습니다.

#!/usr/bin/env bash

위의 예제 envbash실행 파일 을 찾는 데 사용 되며 항상에 있지는 않습니다 /bin/bash. 예를 들어 오래된 #!/bin/bash스크립트는 NixOS 에서 작동하지 않습니다 .

당신이 사용하는 경우 env위의 입증 된 바와 같이, 당신은 같은 인수를 제공 할 수 없습니다 -ebash(내가 아는 한). 그러나 대신에 이것을 할 수 있습니다 :

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

2
나는 항상 이렇게하지만 "더 이식성"이라고 말하지는 않습니다. 사실 사용자가 시스템과 함께 제공 할 수있는 것과 완전히 다른 것을 실행할 위험이 훨씬 더 큽니다. 예를 들어 Ubuntu는 여전히 Bash 4를 제공하지만 사용자는 Bash 5를 실행할 수 있습니다.
slhck

env사용은 기본이 경우 단순히 모르기 때문에 실행 파이썬 것을 스크립트에 대한 좋은 특히 아니다 python버전 2 또는 3이고, 그 특정 버전을 필요로 스크립트 차이의 세계를 만든다. 교묘 한 것보다 명백하게하는 것이 좋습니다
smac89
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.