XPG* 버전의 명령은 언제 사용해야 합니까?

XPG* 버전의 명령은 언제 사용해야 합니까?

grep나는 때때로 기본 버전이 다음과 같은 이전 Solaris 시스템에서 작업합니다.POSIX 호환. grep컴퓨터의 기본 설정이 필요한 옵션을 지원하지 않기 때문에 내 rc 파일에 문제가 발생합니다 .

이것은 내 직장에 있는 기계이고 저는 관리자가 아니기 때문에 적절하다고 생각되는 대로 최신/더 나은 버전의 명령을 설치할 수 없습니다. 그런데 이 기계에 적절한 기능이 있다는 것을 알았습니다.XPGgrep./usr/xpg4/bin/grep

분명히 다음 명령(Solaris의 경우)을 사용하여 rc 파일의 문제를 해결할 수 있습니다.

alias grep='/usr/xpg4/bin/grep'

하지만 이 작업을 수행할 필요가 없는 기계는 어떻습니까? 내 목표는 Unix 계열 시스템에 삽입하여 작동시킬 수 있는 각 셸마다 rc 파일을 갖는 것입니다.

이 생각이 들었습니다...

  1. 사용하고 싶지 않은 상황이 있나요?XPG명령 버전?
    • 그렇다면 언제?
  2. 모든 컴퓨터의 rc 파일 /usr/xpg4/bin/시작 부분에 맹목적으로 추가 $PATH하고 XPG* 버전에 대한 개별 명령의 앨리어싱을 생략할 수는 없나요?
    • 아니면 특정 명령에 문제가 발생합니까?
  3. 이 상황은 /usr/xpg4/bin/"필요한" 컴퓨터에만 존재합니까?
    • /usr/xpg4/bin/내 우분투 컴퓨터에는 이것이 존재하지 않는다는 것을 알았기 때문에 이 질문을 드리는 것입니다 .

대체로 이것이 좋은 생각입니까?

if [ -d "/usr/xpg4/bin" ]; then
  #Place XPG directory at beginning of path to always use XPG version of commands
  export PATH="/usr/xpg4/bin:$PATH"
fi

그렇지 않다면 왜 안 됩니까?

답변1

/bin/usr/bin일부 상용 Unix 시스템에는 및 POSIX 호환 유틸리티가 포함된 디렉토리 뿐만 아니라 이전 버전과 호환되는 유틸리티가 있습니다 . /usr/xpg4/bin이런 방식으로 기존 애플리케이션은 및 PATH만 사용하여 /bin기존 애플리케이션을 고수 할 수 있고 /usr/bin, 최신 애플리케이션은 PATHPOSIX 유틸리티를 먼저 사용할 수 있습니다. Unix 시스템에서 1980년대 유틸리티와의 하위 호환성이 필요하지 않은 한 POSIX 유틸리티를 사용하는 것이 더 좋습니다.

내에서는 .profile다음 디렉토리를 /bin이전과 /usr/bin존재하는 경우 배치했습니다.

/bin/posix
/usr/bin/posix
/usr/xpg6/bin
/usr/xpg4/bin
/usr/xpg2/bin

나는 이것이 최소한 Solaris, Tru64(Digital Unix라고도 함, OSF/1이라고도 함) 및 HP-UX를 포함한다고 생각합니다.

PATHPATH를 자동으로 결정하는 대신 다음을 호출하여 POSIX 종속성에 적합한 애플리케이션을 찾을 수 있어야 합니다.getconf유용:

PATH=$(getconf PATH)

일부 시스템(예: *BSD 및 Linux)은 POSIX 호환 유틸리티만 제공하므로 공통 디렉터리( /bin, /usr/bin)에 있으며 별도의 디렉터리가 필요하지 않습니다.

답변2

첫 번째,아니요귀하의 질문에 설명하는 버전을 사용하십시오 alias. 이는 확실히 최악의 옵션입니다. 반품아니요모든 플랫폼에 대해 하드코딩된 XPG4 경로를 추가합니다.

존재하다솔라리스/usr/xpg4/bin다른 시스템 디렉토리보다 먼저 정의 하면 PATH일반적으로 더 나은 서비스를 받을 수 있습니다 bin. 일반적으로 해당 플랫폼에서는 XPG4 표준 버전의 도구가 더 나은 선택이라고 말하고 싶습니다. (또 다른 중요한 예는 Solaris의 "깨짐"입니다 .) 저는 이 XPG4를 Solaris 플랫폼에 대해서만 정의하여 해당 플랫폼을 요청하고 프로필에 조건부로 설정할 수 있도록 awk권장합니다 .PATH

의 출력에 대해 테스트할 수도 있지만 여러분이 했던 것처럼 디렉토리의 존재를 테스트하는 데에는 문제가 uname없습니다 ./usr/xpg4/bin

답변3

POSIX.2, POSIX.2a, XPG4, SUSv2 표준에서 요구하는 동작이 기존 Solaris 유틸리티 동작과 충돌하는 경우 유틸리티의 원래 Solaris 버전은 변경되지 않고 그대로 유지됩니다 /usr/xpg4/bin. POSIX.1-2001 또는 SUSv3에서 이 동작이 필요한 경우 /usr/xpg4/bin또는 에서 새로운 규격 버전을 사용할 수 있습니다 /usr/xpg6/bin. SUSv3 표준을 준수하는 새 버전이 에 제공됩니다 /usr/xpg6/bin.

표준 호환 유틸리티를 사용하려는 애플리케이션은 PATH( sh(1)또는 ksh(1)) 또는 path( csh(1)) 환경 변수를 설정하여 적절한 폴더를 지정해야 합니다.

답변4

사용 중인 셸에 따라 와 같이 테스트할 수 있는 매개변수가 있을 수 있으며 OSTYPE이를 OS 관련 항목으로 채울 수 있습니다.

if [[ $OSTYPE == solaris* ]]; then
  here be dragons
fi

또는 여러 가지 운영 체제를 사용하는 경우

case $OSTYPE in
  freebsd*|solaris*)
    export MANWIDTH=tty
  ;;
  openbsd*)
    export "PKG_PATH=http://mirror.team-cymru.org/pub/OpenBSD/$(uname -r)/packages/$(uname -p)"
  ;;
esac

관련 정보