강제 POSIX 모드

강제 POSIX 모드

중괄호 확장(예: {a,b,c})POSIX가 정의되지 않았습니다.. POSIX 모드에서 쉘을 실행하고 싶습니다. 데비안의 경우 이는 간단합니다:

$ bash -c 'echo {a,b,c}'
a b c

$ sh -c 'echo {a,b,c}'
{a,b,c}

그러나 Fedora는 다르게 동작합니다.

$ bash -c 'echo {a,b,c}'
a b c

$ sh -c 'echo {a,b,c}'
a b c

옵션을 사용해 보았 --posix으나 효과가 없었습니다.

$ sh --posix -c 'echo {a,b,c}'
a b c

Bash를 POSIX 모드에서 강제로 실행할 수 있나요?

답변1

배쉬는 말할 수 있습니다버팀대 확장 비활성화set +B, 이는 다음의 역수입니다 set -B:

-비쉘은 중괄호 확장을 수행합니다(참조:지원 확장). 이 옵션은 기본적으로 활성화되어 있습니다.

셸을 시작할 때 명령줄에 다음 정보를 제공할 수도 있습니다.

$ bash +B -c 'echo {a,b,c}'
{a,b,c}

와 결합할 수 있습니다.--posix또는 set -o posix옵션전체 POSIX 동작에 더 가깝습니다. 또한 shopt -s xpg_echo최소한 을 활성화 해야 합니다 .

다른 코너도 있을 것입니다. 많은 확장 기능이 상당히 확고히 자리 잡고 있으며 Bash가 실제 동작만 지원하도록 만드는 것은 불가능하다고 생각합니다.필수적인POSIX를 통해. 이것도 dash할 수 없습니다.

그러나 다음을 찾을 수도 있습니다.dash(Debian의 기본값 /bin/sh) 이는 일부 확장도 지원하지만 확장 동작을 피하는 것이 목표인 경우 더 유용합니다. 게다가BusyBox ash애플릿, 일부 확장 기능도 있지만 대부분은 정적으로 비활성화할 수 있습니다.

답변2

Bash 참조 매뉴얼에 따르면 (http://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html), 이는 --posix"Bash를 POSIX와 더욱 호환되게 만들 것입니다". POSIX 요구 사항을 완전히 준수하는 것은 선택 사항이 아닌 것 같습니다.

/bin/sh동작의 차이에 관해서는 Fedora에 심볼릭 링크가 있다는 것을 알게 될 것입니다 . /bin/bash데비안에는 bash가 아닌 것이 있을 수 있습니다 /bin/sh.

답변3

기본 데비안에서는 sh링크가 (is)입니다. Dash는 POSIX의 "중괄호 확장" 동작과 더 일치합니다.dashbash

shBash는 기록과의 차이점을 문서화했습니다(man bash에서):

브래킷 확장은 sh의 이전 버전과 약간 호환되지 않습니다. 여는 괄호나 닫는 괄호가 단어의 일부로 나타나면 sh는 이를 특별히 처리하지 않고 출력에 그대로 둡니다. Bash는 대괄호 확장의 결과로 단어에서 대괄호를 제거합니다. 예를 들어, sh에 입력된 단어 file{1,2}는 출력에서 ​​정확히 동일합니다. Bash 확장 후에는 동일한 단어가 file1 file2로 출력됩니다. sh와의 엄격한 호환성을 원한다면 +B 옵션으로 bash를 시작하거나 set 명령의 +B 옵션을 사용하여 대괄호 확장을 비활성화하세요.

이 직업 중 하나:

bash +B -c 'echo {a,b,c}'
bash -c 'set +B; echo {a,b,c}'

POSIXly bash가 더 필요한 경우:

bash --posix +B -c 'echo {a,b,c}'
bash --posix -c 'set +B; echo {a,b,c}'

기본 셸을 변경하면 /bin/sh시스템 전체에 많은 영향이 미치 /bin/sh므로 dash.

그러나 일반적으로 $HOME/bin/PATH 에서 ~/bin/먼저 설정 됩니다. /bin/따라서 대시 실행 파일을 사용자에게 복사할 수 있으며 ~/bin/sh(기호 링크 또는 실제 링크도 포함) 대시는 해당 사용자의 기본 sh 역할을 합니다.

경우에 따라 ~/bin/사용자 실행 프로그램으로 포함되는 작업은 다음 위치에서 수행됩니다 .profile.

[ -d "${HOME}/bin" ] && export PATH="${HOME}/bin:$PATH"

이는 처음 로그인할 때(사용자의 ServerX 시작 시) bash(거의 모든 쉘)에 의해 획득되며 그 시점부터 환경 값으로 존재합니다.

존재하는 경우 디렉토리를 생성하기만 하면 됩니다 /home/$USER/bin.
물론 다시 로그인하거나 소스를 검색해야 합니다 ~/.profile.

관련 정보