다양한 *nix 버전에서 실행될 수 있도록 쉘 스크립트를 업데이트해야 합니다.

다양한 *nix 버전에서 실행될 수 있도록 쉘 스크립트를 업데이트해야 합니다.

다양한 *nix 버전(red hat linux, hp ux, Solaris)에서 실행되도록 업데이트해야 하는 ksh 및 csh 스크립트가 많이 있습니다. 셸은 각 서버에 로컬로 설치되므로 각 환경에서 작동하도록 해야 합니다.

Linux에서 일부 특정 명령을 찾을 수 없는 문제가 있습니다. 예를 들어 스크립트 사용의 경우 nawkLinux에서는 를 로 바꿔야 합니다 gawk.

/usr/xpg4/bin/grepSolaris에서는 grep-q(quiet) 옵션을 사용할 수 없지만 Linux의 grep은 이 환경에 존재할 수도 있고 존재하지 않기 때문에 스크립트도 사용됩니다 /usr/xpg4/bin/grep.

모든 스크립트를 건드리고 싶지 않기 때문에 좀 더 포괄적인 솔루션을 찾고 있습니다.

별칭 설정을 시도했는데 작동합니다. 그러나 대화형 모드에서만 가능합니다. 스크립트에 별칭을 사용하는 것은 권장되지 않는 것 같습니다...

시스템 디렉터리에 심볼릭 링크를 추가할 수 있지만 이 "가장" 설정을 관리하려면 관리자 권한이 필요하며 설정은 더 이상 이식 가능하지 않습니다.

저는 시스템 관리에 익숙하지 않기 때문에 이러한 요구에 맞는 표준 솔루션이 없을 수도 있습니다.

다시 작성할 필요 없이 이식 가능한 스크립트를 가지려면 어떻게 해야 합니까?

답변1

POSIX올바른 접근 방식은 호환 가능한 명령(예: awk, not nawk또는 gawk, grep, not 사용), 옵션 및 구문을 고수 하고 /usr/xpg4/bin/grep다음과 같이 설정하는 것입니다.PATH

PATH=$(getconf PATH):$PATH

또는 Solaris(이전 Bourne 쉘을 사용하는 경우):

PATH=`getconf PATH`:$PATH

그게 전부입니다. 여기서 시작하는 스크립트는 수정되지 않은 채 실행되어야 합니다. 그러나 #!/bin/sh일반적인 믿음에도 불구하고 shebang을 사용하지 마십시오.아니요 POSIX준수하다. Shebang을 전혀 사용하지 마십시오. 컴퓨터에서 어떤 쉘을 사용할 수 있는지 command -v sh확인하는 데 사용할 수 있습니다 .POSIX

그러나 이식 불가능한 스크립트를 변경하지 않고 유지하려는 것 같습니다. 그런 다음 구문을 사용하여 이전에 제안된 명령 접근 방식을 유지 POSIX하고 프런트 엔드를 추가하여 다른 운영 체제에서 이식할 수 없는 명령을 처리할 수 있습니다. 스크립트가 Bourne 또는 Csh 스타일 셸을 사용하므로 별칭과 함수는 이식 가능하지 않으므로 자체 래퍼 스크립트 라이브러리를 사용하여 PATH.

sh/ksh/bash/...:

PATH=~/bin:`getconf PATH`:$PATH 

명령줄:

set path = ( ~/bin `getconf PATH` $path)

-

mkdir -p ~/bin
cd ~/bin
cat > awk <<%
#!/bin/sh
PATH=`getconf PATH`:$PATH awk "$@"
%
ln -s awk nawk
ln -s awk gawk

답변2

이 경우 변수를 사용합니다.

AWK=awk
GREP=grep

그런 다음 운영 체제를 테스트하십시오.

if [ $(uname -s) == "SunOS" ]
then
  AWK=/usr/bin/nawk
  GREP=/usr/xpg4/bin/grep
fi

(redhat, suse, hp-ux, aix에 대해 이 과정을 반복합니다)

나중에 변수를 사용하십시오

if $GREP -q whatever /some/file
then
   $AWK -F: '{....}' /some/file
fi

이렇게 하면 스크립트가 하나만 있지만 모든 호스트에서 작동합니다.

관련 정보