나는 bash
쉘에 대해 읽고 있으며 POSIX와 호환되도록 하려면 bash
"확장"되어야 한다는 것을 많은 소스에서 이해하고 있습니다. 나에게 이것은 bash에 로드하거나 언로드할 수 있어야 하는 것처럼 들립니다. 해당 주제에 대해 인터넷 검색을 시도했지만 자세한 내용을 찾을 수 없는 것 같습니다. 내가 찾을 수 있는 내용은 기본적으로 "Bash에는 확장이 필요합니다"라고 말했습니다.
Bash가 어떤 확장 기능을 로드하고 있는지 확인할 수 있는 방법이 있나요? 로드 또는 언로드 하시겠습니까? 다르게 구성하시겠습니까?
답변1
Bash에는 POSIX 사양을 초과하거나 위반하는 많은 기능과 동작이 있습니다. 이는 때때로 표준 확장으로 설명됩니다. 일부 응용 프로그램에서는 로드 가능한 확장이 아닙니다.
이러한 확장에는 다음이 포함됩니다.[[
테스트 구문,{a,b,c}
버팀대 확장,가변 간접${!x}
,프로세스는 다음으로 대체됩니다.<(...)
, 그리고 역사적 확장 !
. 확장은비 POSIX이런 의미에서 Bash의 일부입니다.
또한 명령 및 구문 동작에 대한 다양한 변경 사항도 포함됩니다. POSIX 스크립트는 if 로 실행될 때 다르게 동작할 수 있습니다 bash
. 예를 들어, !
기록 확장 시도로 해석되는 문자를 사용하거나 명령 뒤의 사전 명령 할당 문에 의존합니다.
foo() { ... ; }
x=1 foo
echo $x
POSIX에서는 sh
" "가 출력되어야 1
하지만 일반적인 상황에서 변수 네임스페이스가 복잡해지는 것을 피하기 위해 명령에 대한 런타임 bash
할당은 x
명령 뒤에 유지되지 않습니다.
불다동작을 POSIX와 비슷하게 변경하는 POSIX 모드가 있습니다.합리적인 POSIX 스크립트가 다르게 동작하는 경우. 위의 것 외에 time
파이프 명령을 처리하기 위한 Bash의 (매우 유용한) 확장이 있는데, 이는 내장되어 있어야 합니다. POSIX 모드에서는 시스템의 time
실행 파일이 특정 상황에서 실행됩니다.
$ time --help
bash: --help: command not found
$ set -o posix
$ time --help
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
가지다POSIX 모드의 현재 56가지 동작 변경 사항 목록문서에서. 대부분의 다른 확장(예: [[
및 ${!x}
)은 POSIX 모드에서도 여전히 작동하지만 프로세스 교체는 작동하지 않습니다. 대부분의 경우 합법적인 POSIX 스크립트를 손상시킬 수 있는 차이점만 복구됩니다. 이것은 실제로 기존 확장에 대한 유일한 "비활성화"입니다. POSIX 모드에서 POSIX 스크립트는 예상대로 실행되어야 합니다(그렇지 않은 상황을 구성하기는 여전히 쉽지만). POSIX 모드에서도 Bash 스크립트는 표준과 직접적으로 충돌하지 않는 셸에서 제공하는 POSIX가 아닌 일부 기능을 사용할 수 있습니다.
dash
보다 최소한의 POSIX 준수를 달성하려고 시도하는 다른 셸이 있다는 점은 주목할 가치가 있습니다 . POSIX가 아닌 확장을 제거하는 주요 방법은 대신 쉘 중 하나를 사용하는 것입니다.
답변2
bash
POSIX 규정 준수를 시행하는 방법에는 세 가지가 있습니다 .
bash
--posix
옵션 으로 시작하기- 설정 옵션POSIXBash가 이미 실행 중일 때:
set -o posix
환경 변수 사용
POSIXLY_CORRECT
:bash가 시작될 때 이 변수가 환경에 있으면 쉘은 다음을 입력합니다.POSIX 모드
--posix
시작 파일을 읽기 전에는 호출 옵션이 제공된 것과 같습니다 . 쉘이 실행 중일 때 설정되면 bash가 활성화됩니다.POSIX 모드, 마치 명령이set -o posix
실행된 것처럼.
이 세 가지를 사용하면 몇 가지를 작성할 수 있습니다.확장하다(예: bash 시작 중에 로드된 함수) 누군가가 이 작업을 수행했을 수 있지만 그 중 어느 것도 bash 표준이 아닙니다.