grep
나는 때때로 기본 버전이 다음과 같은 이전 Solaris 시스템에서 작업합니다.POSIX 호환. grep
컴퓨터의 기본 설정이 필요한 옵션을 지원하지 않기 때문에 내 rc 파일에 문제가 발생합니다 .
이것은 내 직장에 있는 기계이고 저는 관리자가 아니기 때문에 적절하다고 생각되는 대로 최신/더 나은 버전의 명령을 설치할 수 없습니다. 그런데 이 기계에 적절한 기능이 있다는 것을 알았습니다.XPGgrep
./usr/xpg4/bin/grep
분명히 다음 명령(Solaris의 경우)을 사용하여 rc 파일의 문제를 해결할 수 있습니다.
alias grep='/usr/xpg4/bin/grep'
하지만 이 작업을 수행할 필요가 없는 기계는 어떻습니까? 내 목표는 Unix 계열 시스템에 삽입하여 작동시킬 수 있는 각 셸마다 rc 파일을 갖는 것입니다.
이 생각이 들었습니다...
- 사용하고 싶지 않은 상황이 있나요?XPG명령 버전?
- 그렇다면 언제?
- 모든 컴퓨터의 rc 파일
/usr/xpg4/bin/
시작 부분에 맹목적으로 추가$PATH
하고 XPG* 버전에 대한 개별 명령의 앨리어싱을 생략할 수는 없나요?- 아니면 특정 명령에 문제가 발생합니까?
- 이 상황은
/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
, 최신 애플리케이션은 PATH
POSIX 유틸리티를 먼저 사용할 수 있습니다. 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를 포함한다고 생각합니다.
PATH
PATH를 자동으로 결정하는 대신 다음을 호출하여 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