내장 기능을 사용할 수 있는 bash 버전을 어떻게 알 수 있나요?

내장 기능을 사용할 수 있는 bash 버전을 어떻게 알 수 있나요?

bash특정 내장 기능의 특정 버전이 사용 가능하다는 것을 명령줄에서 알 수 있습니까 ? 각 버전의 릴리스 노트를 검색해야만 가능합니까, 아니면 더 쉬운 방법이 있습니까?

답변1

기능이 추가된 버전을 Bash에 물어볼 방법이 없다고 생각합니다. 이것을 테스트하기 위해 내가 생각할 수 있는 가장 가까운 방법은 다음을 사용하는 것입니다 BASH_COMPAT.compatXY옵션, 내장된 가용성은 포함되지 않습니다(일부가 내장된 가용성에 영향을 주더라도).행동):

compat31

=~설정된 경우 Bash는 조건 명령의 AND 연산자를 사용할 때 조건 명령 연산자에 대한 인용 인수 및 로케일별 문자열 비교 와 관련하여 동작을 버전 3.1로 변경합니다 . bash-4.1 이전의 Bash 버전은 ASCII 조합과 strcmp(3)를 사용하고, bash-4.1 이후 버전은 현재 로케일의 조합 순서와 strcoll(3)을 사용합니다.[[<>

compat32

[[설정된 경우 Bash는 <버전 3.2(이전 항목 참조)에서 조건부 명령 및 연산자를 로케일별 문자열 비교에 사용할 때 동작을 변경 >하고 명령 목록의 효과를 중단합니다. Bash 버전 3.2 이하에서는 인터럽트로 인해 종료된 후 목록의 다음 명령을 계속합니다.

compat40

[[설정된 경우 Bash는 <버전 4.0의 로케일별 문자열 비교에 대한 조건부 명령 및 연산자를 사용할 때 동작을 변경하고 >( 설명 참조 compat31) 명령 목록의 효과를 중단합니다. Bash 4.0 이상에서는 쉘이 인터럽트를 받은 것처럼 목록을 인터럽트합니다. 이전 버전에서는 목록의 다음 명령으로 계속 실행됩니다.

compat41

설정된 경우 Bash는 큰따옴표로 묶인 인수 확장의 작은따옴표를 POSIX 모드의 특수 문자로 처리합니다. 작은따옴표는 일치해야 하며(짝수) 작은따옴표 사이의 문자는 따옴표로 간주됩니다. 이는 버전 4.1 이전 POSIX 모드의 동작이었습니다. 기본 Bash 동작은 이전 버전과 일관되게 유지됩니다.

compat42

설정된 경우 Bash는 패턴 대체 단어 확장에서 대체 문자열을 처리하기 위해 따옴표 제거를 사용하지 않습니다.

compat43

설정된 경우 Bash는 인용된 복합 배열 할당을 인수로 사용하려고 하면 경고 메시지를 인쇄하지 않으며 declare단어 확장 오류는 현재 명령이 실패하도록 하는 치명적이지 않은 오류를 생성합니다(기본 동작은 다음과 같은 치명적인 오류를 만드는 것입니다). 쉘이 종료되도록 함) 그리고 쉘 함수가 실행될 때 루프 상태가 재설정되지 않습니다(이는 호출자 컨텍스트의 루프에 영향을 미치기 위해 쉘 함수에서 중단 또는 계속을 허용합니다).

compat44

설정된 경우 Bash는 확장 디버깅 모드 활성화 여부에 관계없이 위치 인수 BASH_ARGV를 사용하기 전에 저장합니다.BASH_ARGC

실제로 이에 대한 사용 사례는 많지 않습니다. 기능 가용성에 대한 버전 정보를 확인하는 경우 일반적인 조언은 기능(이 경우 내장 기능)의 가용성을 직접 확인하는 것입니다. 결국 이 기능이 있는 버전이라도 컴파일 타임에 비활성화될 수 있습니다. .

예를 들어:

$ for s in bash /bin/bash; do
 for b in compopt help; do
  "$s" -c 'echo "$1" is $([[ $(type "$1" 2>/dev/null) =~ "shell builtin" ]] || echo not) a builtin in "$BASH_VERSION"' _ $b;
 done;
done
compopt is a builtin in 5.0.7(1)-release
help is a builtin in 5.0.7(1)-release
compopt is not a builtin in 3.2.57(1)-release
help is a builtin in 3.2.57(1)-release

관련 정보